我有一个带有@Data
注释的类,但是我不确定是否生成了带参数的构造函数,或者只有生成的构造函数是来自vanilla Java的默认构造函数(无参数)。
答案 0 :(得分:20)
如果没有定义构造函数,将生成@RequiredArgsConstructor
。
@Data就像在类上隐含@Getter,@ Setter,@ ToTtring,@ EqualsAndHashCode和 @RequiredArgsConstructor 注释一样(除非没有明确编写的构造函数,否则不会生成构造函数)存在)强>
答案 1 :(得分:1)
@Data仅创建一个@RequiredArgsConstructor。 Data annotation和constructors的龙目岛文档站点解释了:
@RequiredArgsConstructor生成带有1个参数的构造函数,用于 每个需要特殊处理的字段。所有未初始化的最终 字段获取参数以及标记为的任何字段 @NonNull在声明它们的位置未初始化。对于那些 标有@NonNull的字段,还会生成显式的null检查。 构造函数将抛出NullPointerException,如果任何 用于标有@NonNull的字段的参数包含null。 参数的顺序与字段出现的顺序匹配 在你班上。
假设您有一个使用Lombok @Data批注的POJO:
public @Data class Z {
private String x;
private String y;
}
您不能以Z z = new Z(x,y)的形式创建对象,因为Z类上没有“必需”的arg。它正在使用零参数创建构造函数,因为@Data为您提供了属性的Setters和Getters,并且您可以在创建实例后调用setX和setY。
您可以将x和y设置为@NonNull或final,以便它们必须通过构造函数传递,或者使用@AllArgsConstructor注释类Z。