How to build an object when we have inheritance relationship using lombok builder?
在我的项目中,我正在使用lombok来避免为类编写getter和setter。
另外,我使用lombok.Builder来构建对象,而不是编写新的Obeject()然后设置所有值。
但是,当我们具有继承关系并且想要使用lombok构建器构造子对象时,我没有得到父级的字段。
例如:
1 2 3 4 5 6 7 8 9 10 11 | @Data @NoArgsConstructor @AllArgsConstructor @ToString @EqualsAndHashCode public class Parent{ private String nationality; . . // more columns } |
子类将是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 |
在我的测试课中,我需要建立子对象
1 2 3 4 5 6 7 8 9 10 11 12 | 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中有什么方法可以处理这种情况。
将
将
另外,如果您使用的是
我提供了两个示例,一个示例,其中
父母与子女一成不变
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | import static org.junit.Assert.*; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.ToString; import lombok.Value; import lombok.experimental.NonFinal; import org.junit.Test; public class So32989562ValueTest { @Value @NonFinal public static class Parent { protected final String nationality; } @Value @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public static class Child extends Parent { private final String firstName; private final String lastName; @Builder(toBuilder = true) private Child(String nationality, String firstName, String lastName) { super(nationality); this.firstName = firstName; this.lastName = lastName; } } @Test public void testChildBuilder() { String expectedFirstName ="Jeff"; String expectedLastName ="Maxwell"; String expectedNationality ="USA"; Child result = Child.builder() .firstName(expectedFirstName) .lastName(expectedLastName) .nationality(expectedNationality) .build(); assertEquals(result.toString(), expectedFirstName, result.getFirstName()); assertEquals(result.toString(), expectedLastName, result.getLastName()); assertEquals(result.toString(), expectedNationality, result.getNationality()); } } |
父母可变,子女可变:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import static org.junit.Assert.*; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import lombok.Value; import org.junit.Test; public class So32989562DataTest { @Data public static class Parent { protected String nationality; } @Value @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public static class Child extends Parent { private final String firstName; private final String lastName; @Builder(toBuilder = true) private Child(String nationality, String firstName, String lastName) { this.setNationality(nationality); this.firstName = firstName; this.lastName = lastName; } } @Test public void testChildBuilder() { String expectedFirstName ="Jeff"; String expectedLastName ="Maxwell"; String expectedNationality ="USA"; Child result = Child.builder() .firstName(expectedFirstName) .lastName(expectedLastName) .nationality(expectedNationality) .build(); assertEquals(result.toString(), expectedFirstName, result.getFirstName()); assertEquals(result.toString(), expectedLastName, result.getLastName()); assertEquals(result.toString(), expectedNationality, result.getNationality()); } } |
上述解决方案有效,但是,这需要太多解决方法。而且,子类和父类的任何更改都需要在各处更改构造函数参数。
Lombok引入了实验性功能,其版??本为:1.18.2,用于解决Builder注释所面临的继承问题,并且可以使用@SuperBuilder注释进行解决,如下所示。
1 2 3 4 5 6 7 8 9 10 |
现在,可以使用如下所示的Builder类(@Builder注释无法实现)
1 | ChildClass.builder().a("testA").b("testB").c("testC").build(); |