【问题标题】:Lombok builder pattern issue龙目岛建造者模式问题
【发布时间】:2019-11-01 07:59:09
【问题描述】:

我在 STS (eclipse) 中添加了 Lombok 的 JAR 文件。 我正在使用 Lombok 使用 builder() 创建对象。但是,我在继承方面面临问题。 如果我使用 Lombok 的构建器模式来创建对象,它可以在工作区和可执行 JAR 文件中工作。 但是,如果我使用 Lombok 的构建器模式来创建 inherit 另一个对象的对象,那么它就不起作用了。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class BaseEmp {
    private int a;
    private int b;
}


@Data
@NoArgsConstructor
@Builder
class Emp extends BaseEmp implements Serializable {

    private static final long serialVersionUID = 1L;

    @Builder
    public Emp(int a, int b) {
        super(a, b);
    }

}

Emp emp = Emp.builder.a(ipA).b(ipB).build();

在我打印对象时,a 和 b 值在 JAR 中为 null 并在 STS 中工作。

但是,当我在工作区和 JAR 中转换为正常的对象创建时,这两个地方都可以正常工作。

意味着,在编译时,Lombok 处理器不知何故错过了继承类字段。

【问题讨论】:

  • 如果要创建具有继承性的构建器,则需要使用@SuperBuilder
  • 我尝试了 SuperBuilder(处于测试阶段)和超级类所有参数构造函数的 Builder。
  • SuperBuilder 也不适用于 STS eclipse。无论如何,这甚至都不稳定。我不能将其用于生产

标签: java lombok


【解决方案1】:

如果你扩展另一个类,你真的应该考虑使用@SuperBuilder。虽然它仍处于试验阶段,但 Lombok 维护人员明确表示,这主要是因为它是一个非常年轻、极其复杂的功能,不会像核心功能那样快速获得支持/错误修复。 @SuperBuilder 未来不太可能被重新设计或删除。

但是,如果你想坚持使用@Builder,你不能在类和构造函数上都有@Builder注解。只需将它放在构造函数上,它就可以工作。

此外,您的超类也不应该有@Builder,否则您将在builder() 方法上遇到名称冲突。 (您可以通过使用参数builderMethodName 重命名它来解决此问题。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2021-03-27
    相关资源
    最近更新 更多