CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-palantir-javapoet--javapoet

JavaPoet is a Java API for generating .java source files programmatically with support for modern Java features including records and sealed types

Overview
Eval results
Files

parameter-specifications.mddocs/

Parameter Specifications

ParameterSpec is the specification for method and constructor parameters. It provides a fluent API for building parameter definitions with type, name, modifiers, annotations, and documentation.

Capabilities

Creating Parameter Builders

Create builders for parameter declarations.

/**
 * Creates a ParameterSpec from a VariableElement
 * @param element - The variable element from annotation processing
 * @return ParameterSpec initialized from the element
 */
static ParameterSpec get(VariableElement element);

/**
 * Creates a builder for a parameter declaration
 * @param type - The parameter type as TypeName
 * @param name - The parameter name
 * @param modifiers - Optional modifiers for the parameter
 * @return Builder for configuring a parameter
 */
static ParameterSpec.Builder builder(TypeName type, String name, Modifier... modifiers);

/**
 * Creates a builder for a parameter using reflection Type
 * @param type - The parameter type as reflection Type
 * @param name - The parameter name
 * @param modifiers - Optional modifiers for the parameter
 * @return Builder for configuring a parameter
 */
static ParameterSpec.Builder builder(Type type, String name, Modifier... modifiers);

Usage Examples:

// Simple parameter
ParameterSpec name = ParameterSpec.builder(String.class, "name")
    .build();

// Final parameter
ParameterSpec id = ParameterSpec.builder(int.class, "id", Modifier.FINAL)
    .build();

// Parameterized type parameter
TypeName listOfStrings = ParameterizedTypeName.get(List.class, String.class);
ParameterSpec items = ParameterSpec.builder(listOfStrings, "items")
    .build();

// From annotation processing
ParameterSpec param = ParameterSpec.get(variableElement);

Accessing Parameter Properties

Access the properties of a ParameterSpec.

/**
 * Returns the parameter name
 * @return The parameter name
 */
String name();

/**
 * Returns the annotations on this parameter
 * @return List of AnnotationSpec
 */
List<AnnotationSpec> annotations();

/**
 * Returns the modifiers for this parameter
 * @return Set of Modifier (typically empty or contains FINAL)
 */
Set<Modifier> modifiers();

/**
 * Returns the parameter type
 * @return TypeName of the parameter
 */
TypeName type();

/**
 * Returns the Javadoc comment
 * @return CodeBlock containing Javadoc
 */
CodeBlock javadoc();

Modifying ParameterSpec

Convert to a builder for modification.

/**
 * Creates a builder initialized with this parameter's properties
 * @return Builder for modifying this ParameterSpec
 */
ParameterSpec.Builder toBuilder();

ParameterSpec.Builder

The builder for configuring ParameterSpec instances.

Adding Documentation

Add Javadoc comments to the parameter.

/**
 * Adds Javadoc documentation from a format string
 * @param format - Format string for Javadoc
 * @param args - Arguments for format placeholders
 * @return This builder for chaining
 */
ParameterSpec.Builder addJavadoc(String format, Object... args);

/**
 * Adds Javadoc documentation from a CodeBlock
 * @param block - CodeBlock containing Javadoc
 * @return This builder for chaining
 */
ParameterSpec.Builder addJavadoc(CodeBlock block);

Usage Example:

ParameterSpec timeout = ParameterSpec.builder(int.class, "timeout")
    .addJavadoc("The timeout in seconds\n")
    .build();

Adding Annotations

Add annotations to the parameter declaration.

/**
 * Adds multiple annotations
 * @param annotationSpecs - Iterable of annotations to add
 * @return This builder for chaining
 */
ParameterSpec.Builder addAnnotations(Iterable<AnnotationSpec> annotationSpecs);

/**
 * Adds an annotation from an AnnotationSpec
 * @param annotationSpec - The annotation to add
 * @return This builder for chaining
 */
ParameterSpec.Builder addAnnotation(AnnotationSpec annotationSpec);

/**
 * Adds an annotation by ClassName
 * @param annotation - The annotation class name
 * @return This builder for chaining
 */
ParameterSpec.Builder addAnnotation(ClassName annotation);

/**
 * Adds an annotation by Class
 * @param annotation - The annotation class
 * @return This builder for chaining
 */
ParameterSpec.Builder addAnnotation(Class<?> annotation);

Usage Examples:

// Nullable parameter
ParameterSpec name = ParameterSpec.builder(String.class, "name")
    .addAnnotation(Nullable.class)
    .build();

// NotNull parameter
ParameterSpec email = ParameterSpec.builder(String.class, "email")
    .addAnnotation(NotNull.class)
    .build();

// Custom annotation with members
ParameterSpec value = ParameterSpec.builder(String.class, "value")
    .addAnnotation(AnnotationSpec.builder(Size.class)
        .addMember("min", "$L", 1)
        .addMember("max", "$L", 100)
        .build())
    .build();

// Multiple annotations
ParameterSpec userId = ParameterSpec.builder(String.class, "userId")
    .addAnnotation(NotNull.class)
    .addAnnotation(AnnotationSpec.builder(Pattern.class)
        .addMember("regexp", "$S", "[a-z0-9]+")
        .build())
    .build();

Adding Modifiers

Add modifiers to the parameter declaration.

/**
 * Adds modifiers to the parameter
 * @param modifiers - Modifiers to add (typically FINAL)
 * @return This builder for chaining
 */
ParameterSpec.Builder addModifiers(Modifier... modifiers);

/**
 * Adds modifiers from an iterable
 * @param modifiers - Iterable of modifiers to add
 * @return This builder for chaining
 */
ParameterSpec.Builder addModifiers(Iterable<Modifier> modifiers);

Usage Example:

ParameterSpec config = ParameterSpec.builder(Configuration.class, "config", Modifier.FINAL)
    .build();

// Or add modifiers later
ParameterSpec data = ParameterSpec.builder(byte[].class, "data")
    .addModifiers(Modifier.FINAL)
    .build();

Building the ParameterSpec

Build the final ParameterSpec instance.

/**
 * Builds the ParameterSpec with configured properties
 * @return The built ParameterSpec instance
 */
ParameterSpec build();

Common Patterns

Nullable Parameters

ParameterSpec description = ParameterSpec.builder(String.class, "description")
    .addAnnotation(Nullable.class)
    .build();

MethodSpec setDescription = MethodSpec.methodBuilder("setDescription")
    .addParameter(description)
    .addStatement("this.description = description")
    .build();

Validation Annotations

ParameterSpec age = ParameterSpec.builder(int.class, "age")
    .addAnnotation(AnnotationSpec.builder(Min.class)
        .addMember("value", "$L", 0)
        .build())
    .addAnnotation(AnnotationSpec.builder(Max.class)
        .addMember("value", "$L", 150)
        .build())
    .build();

Generic Type Parameters

TypeVariableName t = TypeVariableName.get("T");
ParameterSpec item = ParameterSpec.builder(t, "item")
    .build();

MethodSpec add = MethodSpec.methodBuilder("add")
    .addTypeVariable(t)
    .addParameter(item)
    .build();

Collection Parameters

TypeName listOfStrings = ParameterizedTypeName.get(
    ClassName.get(List.class),
    ClassName.get(String.class)
);
ParameterSpec names = ParameterSpec.builder(listOfStrings, "names")
    .addAnnotation(NotNull.class)
    .build();

Varargs Parameters

ParameterSpec values = ParameterSpec.builder(Object[].class, "values")
    .build();

MethodSpec format = MethodSpec.methodBuilder("format")
    .addParameter(String.class, "pattern")
    .addParameter(values)
    .varargs()
    .build();

Lambda-Friendly Parameters

TypeName consumer = ParameterizedTypeName.get(
    ClassName.get(Consumer.class),
    ClassName.get(String.class)
);
ParameterSpec callback = ParameterSpec.builder(consumer, "callback")
    .addAnnotation(NotNull.class)
    .build();

MethodSpec process = MethodSpec.methodBuilder("process")
    .addParameter(String.class, "input")
    .addParameter(callback)
    .addStatement("callback.accept(input)")
    .build();

Final Parameters

ParameterSpec immutableValue = ParameterSpec.builder(String.class, "value", Modifier.FINAL)
    .addAnnotation(NotNull.class)
    .build();

MethodSpec constructor = MethodSpec.constructorBuilder()
    .addModifiers(Modifier.PUBLIC)
    .addParameter(immutableValue)
    .addStatement("this.value = value")
    .build();

Request Body Parameters

ParameterSpec requestBody = ParameterSpec.builder(User.class, "user")
    .addAnnotation(ClassName.get("org.springframework.web.bind.annotation", "RequestBody"))
    .build();

MethodSpec createUser = MethodSpec.methodBuilder("createUser")
    .addAnnotation(ClassName.get("org.springframework.web.bind.annotation", "PostMapping"))
    .addParameter(requestBody)
    .returns(User.class)
    .build();

Types

class ParameterSpec {
    static ParameterSpec get(VariableElement element);
    static Builder builder(TypeName type, String name, Modifier... modifiers);
    static Builder builder(Type type, String name, Modifier... modifiers);

    String name();
    List<AnnotationSpec> annotations();
    Set<Modifier> modifiers();
    TypeName type();
    CodeBlock javadoc();
    Builder toBuilder();
    boolean equals(Object o);
    int hashCode();
    String toString();
}

class ParameterSpec.Builder {
    ParameterSpec.Builder addJavadoc(String format, Object... args);
    ParameterSpec.Builder addJavadoc(CodeBlock block);
    ParameterSpec.Builder addAnnotations(Iterable<AnnotationSpec> annotationSpecs);
    ParameterSpec.Builder addAnnotation(AnnotationSpec annotationSpec);
    ParameterSpec.Builder addAnnotation(ClassName annotation);
    ParameterSpec.Builder addAnnotation(Class<?> annotation);
    ParameterSpec.Builder addModifiers(Modifier... modifiers);
    ParameterSpec.Builder addModifiers(Iterable<Modifier> modifiers);
    ParameterSpec build();
}

Install with Tessl CLI

npx tessl i tessl/maven-com-palantir-javapoet--javapoet@0.11.0

docs

annotation-specifications.md

array-type-names.md

class-names.md

code-blocks.md

field-specifications.md

index.md

java-files.md

method-specifications.md

name-allocator.md

parameter-specifications.md

parameterized-type-names.md

type-names.md

type-specifications.md

type-variable-names.md

wildcard-type-names.md

tile.json