首页 > 解决方案 > 龙目岛建造者模式问题

问题描述

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

@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 值null在 JAR 中并在 STS 中工作。

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

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

标签: javalombok

解决方案


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

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

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


推荐阅读