[英]Does lombok @Builder allow extends
我有2个班级:
import lombok.Builder;
@Builder
public class B extends A {
}
和
import lombok.Builder;
@Builder
public class A {
}
在B
上的@Builder
上,我收到消息:
返回类型与 A.builder() 不兼容。
这是lombok的限制吗? 或者我做错了什么?
如果我将@Builder
留在A
,那么B
上的 Builder 似乎不会考虑B
的构造函数中A
中的字段。
最新的 lombok 版本 1.18.2 包括新的实验性@SuperBuilder
。 它支持来自超类(也是抽象类)的继承和字段。 唯一的要求是所有超类都必须有@SuperBuilder
注释。 有了它,解决方案就这么简单:
@SuperBuilder
public class B extends A {
private String b;
}
@SuperBuilder
public class A {
private String a;
}
B instance = B.builder().b("b").a("a").build();
只有一种解决方法才有可能(见#78 )
我们一直在类本身上使用@Builder,但您也可以将它放在类的构造函数或静态方法上。 在这种情况下,Lombok 将为构造函数/方法的每个参数在构建器类上创建一个 setter 方法。 这意味着您可以为类的所有字段(包括其超类)创建一个带有参数的自定义构造函数。
@AllArgsConstructor
public class Parent {
private String a;
}
public class Child extends Parent {
private String b;
@Builder
private Child(String a, String b){
super(a);
this.b = b;
}
}
我无法再重现您的确切问题,但这可能是因为 Lombok 已经进化。
但是,您的部分问题是 be 的构建器不包括 a 的字段。 这仍然是正确的, @AllArgsConstructor
也是@AllArgsConstructor
。 继承不是龙目岛的强项。
Thad 说,由于您可以自己编写构造函数并可以将@Builder
放在构造函数上,因此以下内容将按照您的意愿为 B 生成一个构建器:
@Builder
public class A {
String a;
}
public class B extends A {
@Builder
B(String a, String b) {
super(a);
this.b = b;
}
String b;
}
使用带有 java 继承的 lombok 遇到问题,在父类和子类上使用以下注释后解决:
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@数据
@AllArgsConstructor
@NoArgsConstructor
在不知道 lombok 的实现细节或尝试它的情况下,我会说不,因为模式不允许。
如果您实现构建器模式,则所有方法( build() 除外)将始终将构建器存在的类作为返回类型。
这意味着类 A 的方法只会返回 A。B 总是返回 B。如果现在让 B 从 A 扩展,它不会覆盖 A 的方法,因为它的返回类型不匹配。 反之亦然,它无法实现 B 中的构建器方法,因为这些方法已经存在于 A 中。它们不能通过 OOP 设计共存。
您也许能够创建通用构建器,但这并不能解决问题。 如果您真的需要从 A 扩展,那么您的问题可能来自另一个构建器模式无法解决的设计决策。
我假设不是扩展类,而是在 lombok 应该支持的构建器中使用默认值。 这些默认值然后反映了默认情况下 A 类可能支持的内容。 在您希望让 B 做事的用例中,您可以调用构建器方法并覆盖这些默认值。
编辑:哦,也许看看这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.