【问题标题】:Does the Project Lombok @Data annotation create a constructor of any kind?Project Lombok @Data 注释是否创建任何类型的构造函数?
【发布时间】:2017-02-01 12:04:52
【问题描述】:

我有一个带有 @Data 注释的类,但我不确定是否生成了带参数的构造函数,或者唯一生成的构造函数是来自 vanilla Java 的默认(无参数)构造函数。

【问题讨论】:

    标签: java constructor lombok


    【解决方案1】:

    如果没有定义构造函数,将生成@RequiredArgsConstructor

    Project Lombok @Data page 解释:

    @Data 就像在类 上具有隐式的 @Getter、@Setter、@ToString、@EqualsAndHashCode 和 @RequiredArgsConstructor 注释(除非任何显式编写的构造函数都不会生成构造函数存在)

    【讨论】:

    • Lombok 如何决定(可能的)多个实例中的哪一个用于构造函数参数?当使用 Data 或 RequiredArgsConstructor 注释时
    【解决方案2】:

    @Data 只是创建一个@RequiredArgsConstructor。 Data annotationconstructors 的 Lombok 文档站点解释说:

    @RequiredArgsConstructor 生成一个带有 1 个参数的构造函数 每个需要特殊处理的字段。所有未初始化的final fields 获取参数,以及任何标记为的字段 @NonNull 未在声明它们的位置初始化。对于那些 用@NonNull 标记的字段,还会生成显式空检查。 如果有任何一个,构造函数将抛出 NullPointerException 用于标记有@NonNull 的字段的参数包含空值。 参数的顺序与字段出现的顺序相匹配 在你的课堂上。

    假设你有一个使用 Lombok @Data 注解的 POJO:

    public @Data class Z {
        private String x;
        private String y;
    }
    

    您无法将对象创建为Z z = new Z(x, y);,因为您的 Z 类中没有“必需”的参数。它使用零参数创建构造函数,因为@Data 为您的属性提供了 Setter 和 Getter,并且您可以在创建实例后调用 setX 和 setY。

    您可以将 x 和 y 设为 @NonNull 或 final,因此它们必须通过构造函数传递,或者使用 @AllArgsConstructor 注释您的类 Z。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多