@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor - codercuixin/lombok-translate GitHub Wiki

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

按需生成构造函数: 生成不带参数的, 每个 final/non-null 字段一个参数的,或一个字段一个参数的构造函数。

概览

这组3个注释生成一个构造函数,该构造函数将接受某些字段的参数值,并简单地将参数值赋值给该字段。

@NoArgsConstructor 将生成一个没有参数的构造函数。如果这是不可能的(因为final字段未初始化),将导致编译器错误,除非使用 @NoArgsConstructor(force = true),然后使用 0 / false / null 初始化所有 final 字段。对于具有约束的字段,例如 @NonNull 字段,不会生成任何检查,因此请注意,在稍后正确初始化这些字段之前,通常不会满足这些约束。某些java构造(例如 hibernate 和 Service Provider Interface )需要 no-args 构造函数。此注释主要与 @Data或其他生成构造函数的构造函数组合使用。

@RequiredArgsConstructor 为每个需要特殊处理的字段生成一个带有对应参数的构造函数。所有未初始化的 final 字段,以及未初始化的用 @NonNull 标记的字段,都会获得一个参数。对于标有 @NonNull 的字段,还会生成显式空检查。如果用于标记为 @NonNull 的字段的任何参数是 null,则构造函数将抛出 NullPointerException。参数的顺序与字段在类中的显示顺序相匹配。

@AllArgsConstructor 为类中的每个字段生成对应参数的构造函数。标有 @NonNull 的字段会导致对这些参数进行空检查。

这些注解中的每一个都允许使用替代形式,其中生成的构造函数始终是私有的,并且生成包装私有构造函数的附加静态工厂方法。通过为注释提供 staticName 值来启用此模式,如下所示: @RequiredArgsConstructor(staticName="of")。与普通构造函数不同,这种静态工厂方法将推断泛型。这意味着您的API用户可以编写 MapEntry.of("foo", 5),而不是更长的 new MapEntry<String, Integer>("foo", 5)

要在生成的构造函数上添加注释,可以使用 onConstructor=@__({@AnnotationsHere}),但要小心;这是一个实验性功能。有关更多详细信息,请参阅有关onX功能的文档。

这些注解会跳过静态字段。

与大多数其他 lombok 注解不同,显式构造函数的存在不会阻止这些注解生成自己的构造函数。这意味着你可以编写自己的专用构造函数,并让lombok生成样板构造函数。如果出现冲突(你的一个构造函数最终使用与 lombok 生成的签名相同的签名),则会发生编译器错误。

With Lombok

import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.NonNull;

@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample<T> {
  private int x, y;
  @NonNull private T description;
  
  @NoArgsConstructor
  public static class NoArgsExample {
    @NonNull private String field;
  }
}

Vanilla Java

public class ConstructorExample<T> {
  private int x, y;
  @NonNull private T description;
  
  private ConstructorExample(T description) {
    if (description == null) throw new NullPointerException("description");
    this.description = description;
  }
  
  public static <T> ConstructorExample<T> of(T description) {
    return new ConstructorExample<T>(description);
  }
  
  @java.beans.ConstructorProperties({"x", "y", "description"})
  protected ConstructorExample(int x, int y, T description) {
    if (description == null) throw new NullPointerException("description");
    this.x = x;
    this.y = y;
    this.description = description;
  }
  
  public static class NoArgsExample {
    @NonNull private String field;
    
    public NoArgsExample() {
    }
  }
}

支持的配置键

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附带了一堆“开箱即用”的注解,这些注释已知是可复制的:所有流行的可空/非空注解。

Small Print

即使使用 null 显式初始化字段,lombok 也会考虑按要求避免null,并且不会将该字段视为 'required' 参数。如果你明确地将 null 指定给标记为 @NonNull的字段时,表明你知道自己正在做什么。

永远不会为没有参数的构造函数生成 @ java.beans.ConstructorProperties 注解。这也解释了为什么 @NoArgsConstructor 缺少 suppressConstructorProperties 注解方法。生成的静态工厂方法也不会获得 @ConstructorProperties,因为此注解只能添加到实际构造函数中。

@XArgsConstructor 也可用于枚举定义。生成的构造函数将始终是私有的,因为非私有构造函数在枚举中不合法。您不必指定 AccessLevel.PRIVATE

各种众所周知的关于空值的注释会导致插入空值检查,并将其复制到参数中。有关详细信息,请参阅 Getter/ Setter 文档的small print.

@Data@Value 或任何其他 lombok注解生成构造函数时,不会触发 flagUsage 配置键。

附加部分

添加了一些示例代码,对 Constructor 相关的用法进行了说明, 代码地址