龙目岛建设者的继承
Posted
技术标签:
【中文标题】龙目岛建设者的继承【英文标题】:Inheritance for builders in lombok 【发布时间】:2016-10-11 15:18:18 【问题描述】:我试图在我的项目中使用 lombok。
我有一个 A 类:
@Data
@Builder
public class A
Integer a1;
还有一个 B 类:
@Data
public class B extends A
Integer b1;
@Builder
public B(Integer b1, Integer a1)
super(a1);
this.b1 = b1;
我收到一条错误消息,指出 B 中的 builder() 无法覆盖 A 中的 builder(),因为 BBuilder 中的返回类型与 ABuilder 中的返回类型不兼容。
有没有办法使用 lombok 来做到这一点? 我不想为 B 编写完整的构建器,除非我没有任何其他选择。
PS:由于Issue,我已经为 B 类提供了显式构造函数。 我尝试搜索,但找不到相同的好解决方案。
【问题讨论】:
【参考方案1】:这里我们只需要调用builder的super即可。
@Data
public class B extends A
Integer b1;
@Builder
public B(Integer b1, Integer a1)
super(a1);
this.b1 = b1;
public static class BBuilder extends ABuilder
BBuilder()
super();
【讨论】:
如果父类也有@Builder注解,这个解决方案将不起作用。【参考方案2】:如果您将 Lombok 1.18.4 与 IntelliJ 一起使用,则以下代码适用于您:
@Data
@Builder
class A
Integer a1;
@Data
class B extends A
Integer b1;
@Builder (builderMethodName = "BBuilder")
public B(Integer b1, Integer a1)
super(a1);
this.b1 = b1;
public class Main
public static void main(String[] args)
System.out.println(B.BBuilder().a1(1).b1(1).build());
附带说明,@SuperBuilder 注释在编写此答案时在 IntelliJ 中不起作用。如果您有多级继承,请避免使用 Lombok,否则会使您的 Java 模型混乱。
【讨论】:
【参考方案3】:Lombok 引入了 1.18.2 版本的实验功能,用于解决 Builder 注解面临的继承问题,可以通过 @SuperBuilder 注解解决
请使用lombok版本:1.18.2,子/父类中的@SuperBuilder注解
【讨论】:
【参考方案4】:孩子和父母都应该用@SuperBuilder
标记。
将父母和孩子都作为@Builder
是行不通的。
父类A:
@Data
@SuperBuilder
public class A
Integer a1;
B 类儿童:
@Data
@SuperBuilder
public class B extends A
Integer b1;
【讨论】:
以上是关于龙目岛建设者的继承的主要内容,如果未能解决你的问题,请参考以下文章