Java 当我们使用lombok builder建立继承关系时,如何构建对象?
在我的项目中,我使用lombok来避免为类编写getter和setter。 另外,我正在使用lombok.Builder构建一个对象,而不是编写新的object(),然后设置所有值 但当我们有继承关系,并且想要使用lombok builder构造子对象时,我并没有得到父对象的字段 例如:Java 当我们使用lombok builder建立继承关系时,如何构建对象?,java,inheritance,lombok,Java,Inheritance,Lombok,在我的项目中,我使用lombok来避免为类编写getter和setter。 另外,我正在使用lombok.Builder构建一个对象,而不是编写新的object(),然后设置所有值 但当我们有继承关系,并且想要使用lombok builder构造子对象时,我并没有得到父对象的字段 例如: @Data @NoArgsConstructor @AllArgsConstructor @ToString @EqualsAndHashCode public class Parent{ private
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Parent{
private String nationality;
.
.
// more columns
}
儿童班是这样的:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class Child extends Parent{
private String firstName;
private String lastName;
.
.
}
在我的测试类中,我需要在其中构建子对象
public class Test{
public void testMethod(){
Child child = Child.builder()
.firstName("Rakesh")
.lastName("SS")
.nationality("some text")// I am not able to set nationality
.build();
}
}
请告诉我,有没有办法在lombok处理这种情况。
@Builder
无法确定您希望公开的父项的哪些字段
将@Builder
放置在类上时,只有在该类上明确声明的字段才会添加到*Builder
当将@Builder
放置在静态方法或构造函数上时,生成的*Builder
将为每个参数提供一个方法
另外,如果您使用的是@Builder
,那么是否可以安全地假设至少子项
是不可变的
我提供了两个例子,一个是父项是可变的,子项是不可变的,另一个是父项和子项都是不可变的
不可变的父项和子项
import static org.junit.Assert.*;
进口龙目造船厂;
导入lombok.EqualsAndHashCode;
进口龙目草;
进口龙目山价值;
导入lombok.experimental.NonFinal;
导入org.junit.Test;
公共类SO32989562值测试{
@价值观
@非最终
公共静态类父类{
受保护的最终国籍;
}
@价值观
@ToString(callSuper=true)
@EqualsAndHashCode(callSuper=true)
公共静态类子级扩展父级{
私有最终字符串名;
私有最终字符串lastName;
@生成器(toBuilder=true)
私有子项(字符串国籍、字符串名字、字符串姓氏){
超级(国籍);
this.firstName=firstName;
this.lastName=lastName;
}
}
@试验
public void testChildBuilder(){
字符串expectedFirstName=“Jeff”;
字符串expectedLastName=“Maxwell”;
字符串expectedNational=“USA”;
子结果=Child.builder()
.firstName(expectedFirstName)
.lastName(预期lastName)
.国籍(预期国籍)
.build();
assertEquals(result.toString(),expectedFirstName,result.getFirstName());
assertEquals(result.toString(),expectedLastName,result.getLastName());
assertEquals(result.toString()、ExpectedNational、result.getNational());
}
}
可变父级,不可变子级:
import static org.junit.Assert.*;
进口龙目造船厂;
导入龙目数据;
导入lombok.EqualsAndHashCode;
进口龙目草;
进口龙目山价值;
导入org.junit.Test;
公共类SO32989562数据测试{
@资料
公共静态类父类{
受保护的国籍;
}
@价值观
@ToString(callSuper=true)
@EqualsAndHashCode(callSuper=true)
公共静态类子级扩展父级{
私有最终字符串名;
私有最终字符串lastName;
@生成器(toBuilder=true)
私有子项(字符串国籍、字符串名字、字符串姓氏){
这.国籍(国籍);;
this.firstName=firstName;
this.lastName=lastName;
}
}
@试验
public void testChildBuilder(){
字符串expectedFirstName=“Jeff”;
字符串expectedLastName=“Maxwell”;
字符串expectedNational=“USA”;
子结果=Child.builder()
.firstName(expectedFirstName)
.lastName(预期lastName)
.国籍(预期国籍)
.build();
assertEquals(result.toString(),expectedFirstName,result.getFirstName());
assertEquals(result.toString(),expectedLastName,result.getLastName());
assertEquals(result.toString()、ExpectedNational、result.getNational());
}
}
上述解决方案可行,但这需要太多的变通方法。此外,子类和父类中的任何更改都需要到处更改构造函数参数
Lombok在版本1.18.2中引入了实验性功能,用于解决Builder注释面临的继承问题,并可通过@SuperBuilder注释解决,如下所示
@SuperBuilder
public class ParentClass {
private final String a;
private final String b;
}
@SuperBuilder
public class ChildClass extends ParentClass{
private final String c;
}
现在,可以按如下方式使用生成器类(这在@Builder注释中是不可能的)
不确定,为什么被否决请让我知道,如果有什么我可以改进
ChildClass.builder().a("testA").b("testB").c("testC").build();