Java 龙目岛建筑商的遗产
我试图在我的项目中使用lombok 我有一个甲级:Java 龙目岛建筑商的遗产,java,inheritance,design-patterns,builder,lombok,Java,Inheritance,Design Patterns,Builder,Lombok,我试图在我的项目中使用lombok 我有一个甲级: @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中的build
@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:我已经给出了类B的显式构造函数,原因是。
我尝试过搜索,但找不到一个好的解决方案。这里我们只需要调用生成器的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();
}
}
}
Lombok在版本1.18.2中引入了实验性功能,用于解决Builder注释面临的继承问题,并且可以通过@SuperBuilder注释解决
请使用lombok版本:1.18.2,子/父类中的@SuperBuilder注释如果您将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模型变得混乱。如果您的父类已经有了
@Builder
,那么您的子类应该标记为@SuperBuilder
将父级和子级同时作为@Builder
将不起作用
A类家长:
B类儿童:
如果父类也有@Builder注释,则此解决方案将不起作用。
@Data
@Builder
public class A {
Integer a1;
}
@Data
@SuperBuilder
public class B extends A {
Integer b1;
}