@SuperBuilder
Bob 现在知道他的祖先了:构建器也带有来自超类的字段。
@SuperBuilder
在 lombok v1.18.2 中作为实验性功能引入。
@SuperBuilder
的 toBuilder
功能和对自定义的有限支持在 lombok v1.18.4 中添加。
@SuperBuilder
自定义可能性在 lombok v1.18.14 中得到扩展。
概述
@SuperBuilder
注解为您的类生成复杂的构建器 API。与 @Builder
相比,@SuperBuilder
也适用于来自超类的字段。但是,它仅适用于类型。最重要的是,它要求所有超类也具有 @SuperBuilder
注解。
@SuperBuilder
让您可以自动生成代码,以便使用如下代码实例化您的类
Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
@SuperBuilder
可以为集合参数/字段生成所谓的“单数”方法。有关详细信息,请参阅 @Builder
中的 @Singular
文档。
@SuperBuilder
在类上生成一个受保护的构造函数,该构造函数将构建器实例作为参数。此构造函数将新实例的字段设置为来自构建器的值。
@SuperBuilder
与 @Builder
不兼容。
您可以使用 @SuperBuilder(toBuilder = true)
也在您的类中生成一个名为 toBuilder()
的实例方法;它创建一个新的构建器,该构建器以该实例的所有值开始。使用 toBuilder
要求所有超类也具有 toBuilder = true
。您可以将 @Builder.ObtainVia
注解放在字段上,以指示从此实例获取该字段/参数值的替代方法。例如,您可以指定要调用的方法:@Builder.ObtainVia(method = "calculateFoo")
。
为了确保类型安全,@SuperBuilder
为每个注解类生成两个内部构建器类,一个抽象类和一个具体类,分别名为 FoobarBuilder
和 FoobarBuilderImpl
(其中 Foobar 是注解类的名称)。
您可以自定义 @SuperBuilder
生成的大部分代码,除了内部方法(例如 self()
)。您必须确保构建器类声明标头与 lombok 生成的标头匹配。由于大量使用泛型,我们强烈建议在自定义 @SuperBuilder
时,将未经自定义的 delombok 代码 作为参考。
构建器的可配置方面包括
- build() 方法的名称(默认值:
"build"
) - builder() 方法的名称(默认值:
"builder"
) - 是否需要
toBuilder()
(默认值:否) - (不建议)是否希望构建器的“set”方法具有前缀,例如
Person.builder().setName("Jane").build()
而不是Person.builder().name("Jane").build()
以及它应该是什么。
@SuperBuilder(buildMethodName = "execute", builderMethodName = "helloWorld", toBuilder = true, setterPrefix = "set")
希望将您的 superbuilder 与 Jackson,JSON/XML 工具一起使用?我们为您考虑周全:查看 @Jacksonized 功能。
支持的配置键
-
lombok.builder.className
= [一个 Java 标识符,带有一个可选的星号,指示返回类型名称的位置](默认值:*Builder
) - 这是生成的构建器类的名称;名称中的任何星号都将替换为相关的返回类型。请注意,父类也必须具有相同的设置(使用
@SuperBuilder
注解的整个类型层次结构都需要相同的设置)。 -
lombok.superBuilder.flagUsage
= [warning
|error
](默认值:未设置) - 如果配置,Lombok 将把任何
@SuperBuilder
的使用标记为警告或错误。 -
lombok.singular.useGuava
= [true
|false
](默认值:false) - 如果为
true
,lombok 将使用 guava 的ImmutableXxx
构建器和类型来实现java.util
集合接口,而不是创建基于Collections.unmodifiableXxx
的实现。如果使用此设置,您必须确保 guava 实际上在类路径和构建路径上可用。如果您的字段/参数具有 guavaImmutableXxx
类型之一,则会自动使用 Guava。 -
lombok.singular.auto
= [true
|false
](默认值:true) - 如果为
true
(默认值),lombok 会通过假设您的标识符名称是常见的英语复数形式来自动尝试将其单数化。如果为false
,您必须始终显式指定单数名称,否则 lombok 将生成错误(如果您使用英语以外的语言编写代码,则很有用)。
小字号
生成的构建器代码在很大程度上依赖于泛型,以避免在使用构建器时进行类转换。
有关 @Singular
的评论,请参阅 @Builder
文档的 小字号。
关于空值的各种众所周知的注解会导致插入空值检查,并将复制到构建器的“setter”方法的参数。有关更多信息,请参阅 Getter/Setter 文档的小字号。