◀︎ RecordBuilder • Customizing RecordBuilder
Note: @RecordBuilderFull
has most optional features enabled. It's an alternate
form of @RecordBuilder
that uses the templating mechanism to
enable optional features.
RecordBuilder can be customized in a number of ways. The types of customizations will change over time. See
RecordBuilder Options
for the current set of customizations and their default values. For example, the useImmutableCollections
option
adds special handling for record components of type java.util.List
, java.util.Set
, java.util.Map
and java.util.Collection
. When the record is built, any components of these types are passed through an added shim method that uses the corresponding immutable collection (e.g. List.copyOf(o)
) or an empty immutable collection if the component is null
.
You can:
- Customize an entire build - all uses of
@RecordBuilder
in your project - Customize a single record annotated with
@RecordBuilder
- Create a custom annotation that specifies your options and use that instead of
@RecordBuilder
To customize an entire build, use javac's annotation processor options via -A
on the command line.
The options available are the same as the attributes in @RecordBuilder.Options.
i.e. to disable "prefixing enclosing class names", compile with:
javac -AprefixEnclosingClassNames=false ...
Note: use a separate -A
for each option.
If you are using Maven, specify the options in the compiler plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin-version}</version>
<configuration>
<compilerArgs>
<arg>-AprefixEnclosingClassNames=false</arg>
<arg>-AfileComment="something different"</arg>
</compilerArgs>
</configuration>
</plugin>
For Gradle, specify the options:
compilerArgs.addAll(['-AprefixEnclosingClassNames=false', '-AfileComment="something different"'])
To customize a single record, add @RecordBuilder.Options
(options details) in addition to
@RecordBuilder
.
E.g.
@RecordBuilder.Options(withClassName = "Wither")
@RecordBuilder
public record MyRecord(String s){}
Using @RecordBuilder.Template
you can create your own RecordBuilder annotation
that uses the set of options you want. E.g. to create a custom annotation that
uses an alternate file comment and an alternate With classname:
@RecordBuilder.Template(options = @RecordBuilder.Options(
fileComment = "MyCo license",
withClassName = "Wither"
))
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
@Inherited
public @interface MyCoRecordBuilder {
}
Now, you can use @MyCoRecordBuilder
instead of @RecordBuilder
and the record
will be built with options as specified.
Note: the template mechanism also supports @RecordInterface
templates via the asRecordInterface
attribute.
When it is set a @RecordInterface
template is created instead.