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的限制吗?或者我做错了什么?
如果我离开了@Builder断A,然后在Builder B似乎并没有考虑字段A的构造函数B.
最新的 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 执行某些操作的用例中,您可以调用构建器方法并覆盖这些默认值。
编辑:哦,也许看看这里
| 归档时间: |
|
| 查看次数: |
3908 次 |
| 最近记录: |