@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
按需定制构造器:生成无参构造器,每个 final / non-null 字段一个参数的构造器,或每个字段一个参数的构造器。
概述
这组 3 个注解生成一个构造器,该构造器将为某些字段接受 1 个参数,并将此参数简单地赋值给字段。
@NoArgsConstructor
将生成一个没有参数的构造器。如果这是不可能的(因为 final 字段),则会产生编译器错误,除非使用 @NoArgsConstructor(force = true)
,那么所有 final 字段都将使用 0
/ false
/ null
初始化。对于具有约束的字段,例如 @NonNull
字段,不会 生成检查,因此请注意,这些约束通常在这些字段稍后正确初始化之前不会被满足。某些 Java 构造,例如 Hibernate 和服务提供者接口,需要一个无参构造器。此注解主要与 @Data
或其他构造器生成注解之一结合使用时很有用。
@RequiredArgsConstructor
为每个需要特殊处理的字段生成一个带 1 个参数的构造器。所有未初始化的 final
字段以及任何标记为 @NonNull
且未在其声明位置初始化的字段都会获得一个参数。对于那些标记为 @NonNull
的字段,还会生成显式的 null 检查。如果任何用于标记为 @NonNull
的字段的参数包含 null
,则构造器将抛出 NullPointerException
。参数的顺序与字段在类中出现的顺序相匹配。
@AllArgsConstructor
为类中的每个字段生成一个带 1 个参数的构造器。标记为 @NonNull
的字段会导致对这些参数进行 null 检查。
这些注解中的每一个都允许使用替代形式,其中生成的构造器始终是私有的,并且生成一个额外的静态工厂方法来包装私有构造器。通过为注解提供 staticName
值来启用此模式,例如:@RequiredArgsConstructor(staticName="of")
。与普通构造器不同,这样的静态工厂方法将推断泛型。这意味着您的 API 用户可以编写 MapEntry.of("foo", 5)
,而不是更长的 new MapEntry<String, Integer>("foo", 5)
。
要在生成的构造器上放置注解,您可以使用 onConstructor=@__({@AnnotationsHere})
,但请注意;这是一个实验性功能。有关更多详细信息,请参阅 onX 功能的文档。
静态字段会被这些注解跳过。
与大多数其他 Lombok 注解不同,显式构造器的存在不会阻止这些注解生成它们自己的构造器。这意味着您可以编写自己的专用构造器,并让 Lombok 也生成样板构造器。如果出现冲突(您的构造器之一最终与 Lombok 生成的构造器具有相同的签名),则会发生编译器错误。
使用 Lombok
import lombok.AccessLevel;
|
原生 Java
public class ConstructorExample<T> {
|
支持的配置键
-
lombok.anyConstructor.addConstructorProperties
= [true
|false
] (默认值:false
) - 如果设置为
true
,则 Lombok 将向生成的构造器添加@java.beans.ConstructorProperties
。 -
lombok.
[allArgsConstructor
|requiredArgsConstructor
|noArgsConstructor
].flagUsage
= [warning
|error
] (默认值: 未设置) - 如果配置了,Lombok 将把任何对相关注解 (
@AllArgsConstructor
,@RequiredArgsConstructor
或@NoArgsConstructor
) 的使用标记为警告或错误。 -
lombok.anyConstructor.flagUsage
= [warning
|error
] (默认值: 未设置) - 如果配置了,Lombok 将把任何对 3 个构造器生成注解的任何使用的标记为警告或错误。
-
lombok.copyableAnnotations
= [完全限定类型列表] (默认值: 空列表) - Lombok 将把这些注解中的任何一个从字段复制到构造器参数、setter 参数和 getter 方法。请注意,Lombok 开箱即用地提供了一堆已知可复制的注解:所有流行的 nullable/nonnull 注解。
-
lombok.noArgsConstructor.extraPrivate
= [true
|false
] (默认值: false) - 如果为
true
,Lombok 将为任何@Value
或@Data
注解的类生成一个私有的无参构造器,该构造器将所有字段设置为默认值 (null / 0 / false)。
小字声明
即使字段显式初始化为 null
,Lombok 也会认为避免 null 的要求已满足,并且不会将该字段视为“必需”参数。假设是,如果您显式地将 null
分配给您也标记为 @NonNull
的字段,则表示您必须知道自己在做什么。
@java.beans.ConstructorProperties
注解永远不会为没有参数的构造器生成。这也解释了为什么 @NoArgsConstructor
缺少 suppressConstructorProperties
注解方法。生成的静态工厂方法也不会获得 @ConstructorProperties
,因为此注解只能添加到真正的构造器中。
@XArgsConstructor
也可以在枚举定义上使用。生成的构造器将始终是私有的,因为非私有构造器在枚举中是不合法的。您不必指定 AccessLevel.PRIVATE
。
关于 null 值的各种众所周知的注解会导致插入 null 检查,并将被复制到参数。有关更多信息,请参阅 Getter/Setter 文档的小字部分。
当构造器由 @Data
、@Value
或任何其他 Lombok 注解生成时,flagUsage
配置键不会触发。