如何确保 child class 将在 lombok 中调用正确的超级构造函数?
How to ensure that child class will call the correct super constructor in lombok?
说我有以下classes
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class A {
private String item1;
private String item2;
private String item3;
}
和
@Data
public class B extends A {
private String item4;
@Builder(builderMethodName = "bBuilder")
public B(String item1, String item2, String item3, String item4) {
super(item1, item2, item3);
this.item4 = item4;
}
}
我如何(或者甚至有办法)保证在我调用超级构造函数时子构造函数会调用 "correct" 构造函数?更具体地说,我想 100% 确保我传入的三个字符串值确实设置为父项中的正确字段,而不是将 item1 in 设置为 item2.
我知道我可以,例如:
- 显式创建我自己的所有参数构造函数
- 在子构造函数中,调用父构造函数的所有设置器
但我很好奇 Lombok 是否足够聪明,以某种方式将子 class 中的字段设置为父 class 中的正确字段?
编辑:
我知道字段的顺序决定了构造函数字段的顺序,但对我来说这不够安全,因为如果有人插入一个新字段,比如说在中间,那么它会抛出一切关闭。
然而,也许 @SuperBuilder 可能是我可以使用的东西,正如一些人所建议的那样,如果不是,那么我将直接创建我自己的构造函数来保证字段的顺序。
@AllArgsConstructor
的参数顺序与源代码中字段的顺序相匹配。所以现在你是安全的。
但是,如果您稍后修改 A
中字段的顺序(或重命名它们),您将得到错误的赋值(或错误的构建器中的参数名称),但不会出现编译器错误。
但有一个简单的解决方法:使用 @SuperBuilder
,然后删除 @Data
。 (请注意,您的层次结构中的所有 类 都需要 @SuperBuilder
。)您不会得到 @AllArgsConstructor
,对字段顺序的更改无关紧要,并且名称更改会立即反映在建造者 类.
如果那不可能,您唯一的选择是在 A
中添加一个大的警告注释,建议后来的编码人员不要弄乱名称和顺序。
说我有以下classes
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class A {
private String item1;
private String item2;
private String item3;
}
和
@Data
public class B extends A {
private String item4;
@Builder(builderMethodName = "bBuilder")
public B(String item1, String item2, String item3, String item4) {
super(item1, item2, item3);
this.item4 = item4;
}
}
我如何(或者甚至有办法)保证在我调用超级构造函数时子构造函数会调用 "correct" 构造函数?更具体地说,我想 100% 确保我传入的三个字符串值确实设置为父项中的正确字段,而不是将 item1 in 设置为 item2.
我知道我可以,例如:
- 显式创建我自己的所有参数构造函数
- 在子构造函数中,调用父构造函数的所有设置器
但我很好奇 Lombok 是否足够聪明,以某种方式将子 class 中的字段设置为父 class 中的正确字段?
编辑:
我知道字段的顺序决定了构造函数字段的顺序,但对我来说这不够安全,因为如果有人插入一个新字段,比如说在中间,那么它会抛出一切关闭。
然而,也许 @SuperBuilder 可能是我可以使用的东西,正如一些人所建议的那样,如果不是,那么我将直接创建我自己的构造函数来保证字段的顺序。
@AllArgsConstructor
的参数顺序与源代码中字段的顺序相匹配。所以现在你是安全的。
但是,如果您稍后修改 A
中字段的顺序(或重命名它们),您将得到错误的赋值(或错误的构建器中的参数名称),但不会出现编译器错误。
但有一个简单的解决方法:使用 @SuperBuilder
,然后删除 @Data
。 (请注意,您的层次结构中的所有 类 都需要 @SuperBuilder
。)您不会得到 @AllArgsConstructor
,对字段顺序的更改无关紧要,并且名称更改会立即反映在建造者 类.
如果那不可能,您唯一的选择是在 A
中添加一个大的警告注释,建议后来的编码人员不要弄乱名称和顺序。