Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我们使用lombok builder建立继承关系时,如何构建对象?_Java_Inheritance_Lombok - Fatal编程技术网

Java 当我们使用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

在我的项目中,我使用lombok来避免为类编写getter和setter。 另外,我正在使用lombok.Builder构建一个对象,而不是编写新的object(),然后设置所有值

但当我们有继承关系,并且想要使用lombok builder构造子对象时,我并没有得到父对象的字段

例如:

@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();