【发布时间】:2017-02-01 12:04:52
【问题描述】:
我有一个带有 @Data 注释的类,但我不确定是否生成了带参数的构造函数,或者唯一生成的构造函数是来自 vanilla Java 的默认(无参数)构造函数。
【问题讨论】:
标签: java constructor lombok
我有一个带有 @Data 注释的类,但我不确定是否生成了带参数的构造函数,或者唯一生成的构造函数是来自 vanilla Java 的默认(无参数)构造函数。
【问题讨论】:
标签: java constructor lombok
如果没有定义构造函数,将生成@RequiredArgsConstructor。
@Data 就像在类 上具有隐式的 @Getter、@Setter、@ToString、@EqualsAndHashCode 和 @RequiredArgsConstructor 注释(除非任何显式编写的构造函数都不会生成构造函数存在)。
【讨论】:
@Data 只是创建一个@RequiredArgsConstructor。 Data annotation 和 constructors 的 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。
【讨论】: