@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();
如果不知道lombok的实现细节或不尝试它,我会说不,因为模式不允许。 如果你实现了构建器模式,你所有的方法(除了build())都将始终以构建器存在的类作为返回类型。 这意味着类A的方法将只返回A。B也总是返回B。如果你现在让B从A扩展,它将不会覆盖A的方法,因为它的返回类型不匹配。反之亦然,它不能在B中实现构建器方法,因为这些方法已经存在于A中。它们不能通过OOP设计共存。 你可以创建一个通用的构建器,但这并不能解决问题。如果你真的需要从A扩展,你的问题可能来自另一个构建器模式无法解决的设计决策。 我假设不是扩展类,而是在构建器中使用lombok应该支持的默认值。这些默认值反映了类A默认支持的内容。在一个用例中,你宁愿让B做一些事情,然后调用构建器方法并覆盖这些默认值。 编辑:哦,也许have a look here
5条答案
按热度按时间kzmpq1sx1#
最新的lombok版本1.18.2包含the new experimental
@SuperBuilder
。它支持继承和超类(也是抽象类)的字段。唯一的要求是所有超类必须有@SuperBuilder
注解。有了它,解决方案就像这样简单:字符串
lztngnrs2#
只有使用解决方案(See #78)才有可能
我们一直在类本身上使用@Builder,但您也可以将其放在类的构造函数或静态方法上。在这种情况下,Lombok将为构造函数/方法的每个参数在builder类上创建一个setter方法。这意味着您可以创建一个自定义构造函数,其中包含类的所有字段的参数,包括其超类。
字符串
w1e3prcc3#
使用lombok与java继承时遇到的问题,在父类和子类上使用以下注解后解决:
字符串
kulphzqa4#
我不能重现你的确切问题了,但这可能是因为Lombok岛已经进化了。
然而,你的问题的一部分是,be的构建器不包括a的字段。这仍然是正确的,
@AllArgsConstructor
也是如此。继承不是Lombok的强项。Thad说,既然你可以自己编写构造函数,也可以把
@Builder
放在构造函数上,下面的代码将按照你的意愿为B生成一个构建器:个字符
p8ekf7hl5#
如果不知道lombok的实现细节或不尝试它,我会说不,因为模式不允许。
如果你实现了构建器模式,你所有的方法(除了build())都将始终以构建器存在的类作为返回类型。
这意味着类A的方法将只返回A。B也总是返回B。如果你现在让B从A扩展,它将不会覆盖A的方法,因为它的返回类型不匹配。反之亦然,它不能在B中实现构建器方法,因为这些方法已经存在于A中。它们不能通过OOP设计共存。
你可以创建一个通用的构建器,但这并不能解决问题。如果你真的需要从A扩展,你的问题可能来自另一个构建器模式无法解决的设计决策。
我假设不是扩展类,而是在构建器中使用lombok应该支持的默认值。这些默认值反映了类A默认支持的内容。在一个用例中,你宁愿让B做一些事情,然后调用构建器方法并覆盖这些默认值。
编辑:哦,也许have a look here