美文网首页
@NoArgsConstructor, @RequiredArg

@NoArgsConstructor, @RequiredArg

作者: eagle_king | 来源:发表于2019-01-13 15:12 被阅读0次

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

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

Overview

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

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

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

@AllArgsConstructor为类中的每个字段生成一个带有1个参数的构造函数。标记为@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() {
    }
  }
}

Supported configuration keys:

lombok.anyConstructor.addConstructorProperties = [true | false] (default: false)
lombok.[allArgsConstructor|requiredArgsConstructor|noArgsConstructor].flagUsage = [warning | error] (default: not set)
lombok.anyConstructor.flagUsage = [warning | error] (default: not set)
lombok.copyableAnnotations = [A list of fully qualified types] (default: empty list)

Small print

即使一个字段被显式初始化null,lombok也会考虑避免null满足的要求,并且不会将该字段视为“必需”参数。假设你明确指定null一个你也标记为@NonNull信号的字段,你必须知道你在做什么。

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

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

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

flagUsage当通过产生一个构造配置键不触发@Data@Value或任何其他Lombok的注释。

相关文章

  • @NoArgsConstructor, @RequiredArg

    在Lombok中,生成构造方法的annotation一共有三个,@NoArgsConstructor, @Requ...

  • @NoArgsConstructor, @RequiredArg

    @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsCon...

  • lombook

    lombok@NoArgsConstructor@AllArgsConstructor@Builder

  • lombok用法

    @Data @AllArgsConstructor @NoArgsConstructor @Setter @Get...

  • 第二章 Lombok框架

    常用注解@Data@Getter@Setter@NoArgsConstructor@AllArgsConstruc...

  • lombok插件简记

    @Builder和@NoArgsConstructor同时使用时会报错 两个同时使用时需要加上@AllArgsCo...

  • 2019-04-29 工作中遇到问题记录

    lombok问题 @Builder和@NoArgsConstructor同时使用时会报错 两个同时使用时需要加上@...

  • lombok插件

    在哪里用?--实体类注解 @NoArgsConstructor:添加一个无参的构造方法注解 @AllArgsCon...

  • 无参构造器

    1、子类没有构造函数时,自动调用父类的无参构造函数 运行结果:Animal NoArgsConstructor 2...

网友评论

      本文标题:@NoArgsConstructor, @RequiredArg

      本文链接:https://www.haomeiwen.com/subject/ttxldqtx.html