lombok @Builder是否允许扩展

Aix*_*nes 8 java eclipse lombok

我有2个班:

import lombok.Builder;
@Builder
public class B extends A {
}
Run Code Online (Sandbox Code Playgroud)

import lombok.Builder;
@Builder
public class A {
}
Run Code Online (Sandbox Code Playgroud)

@Builder上面B我收到消息:

返回类型与A.builder()不兼容.

这是lombok的限制吗?或者我做错了什么?

如果我离开了@BuilderA,然后在Builder B似乎并没有考虑字段A的构造函数B.

Jan*_*eke 9

最新的 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();
Run Code Online (Sandbox Code Playgroud)


get*_*ckx -1

如果不知道 lombok 的实现细节或尝试它,我会说不,因为该模式不允许这样做。

如果实现构建器模式,所有方法(除了 build() )将始终将构建器存在的类作为返回类型。

这意味着类 A 的方法只会返回 A。B 也总是返回 B。如果您现在让 B 从 A 扩展,它不会覆盖 A 的方法,因为它的返回类型不匹配。反之亦然,它无法实现 B 中的构建器方法,因为这些方法已经存在于 A 中。通过 OOP 设计,它们不能共存。

您也许可以创建一个通用构建器,但这并不能解决问题。如果您确实需要从 A 扩展,您的问题可能来自构建器模式无法解决的另一个设计决策。

我假设您不需要扩展类,而是在构建器中拥有 lombok 应该支持的默认值。这些默认值反映了 A 类默认支持的内容。在您希望 B 执行某些操作的用例中,您可以调用构建器方法并覆盖这些默认值。

编辑:哦,也许看看这里