@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 配置键不会触发。