lombok中的建设者的继承

Abh*_*wal 15 java inheritance design-patterns builder lombok

我试图将lombok用于我的项目.

我有一个A类:

@Data
@Builder
public class A {
    Integer a1;
}
Run Code Online (Sandbox Code Playgroud)

和B级:

@Data
public class B extends A {
    Integer b1;

    @Builder
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误,说B中的builder()无法覆盖A中的builder(),因为BBuilder中的返回类型与ABuilder中的返回类型不兼容.

有没有办法用lombok做到这一点?我不想为B写完整的构建器,除非我没有任何其他选项.

PS:由于问题,我为B类提供了明确的构造函数.我试着搜索,但我找不到同样好的解决方案.任何帮助都非常感谢.

Abh*_*wal 20

在这里,我们只需要调用构建器的超级.

@Data
public class B extends A {
    Integer b1;

    @Builder
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }

    public static class BBuilder extends ABuilder{
            BBuilder() {
                super();
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果父类也有 @Builder 注释,则此解决方案将不起作用。 (5认同)

wal*_*alv 19

孩子和父母都应该标记为@SuperBuilder

同时拥有父母和孩子是@Builder行不通的。

家长A类:

@Data
@SuperBuilder
public class A {
    Integer a1;
}
Run Code Online (Sandbox Code Playgroud)

儿童B级:

@Data
@SuperBuilder
public class B extends A {
    Integer b1;
}
Run Code Online (Sandbox Code Playgroud)


rea*_*lPK 8

如果您将 Lombok 1.18.4 与 IntelliJ 一起使用,以下代码将适用于您:

@Data
@Builder
class A {
    Integer a1;
}

@Data
class B extends A {
    Integer b1;

    @Builder (builderMethodName = "BBuilder")
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }
}

public class Main {

    public static void main(String[] args){
    System.out.println(B.BBuilder().a1(1).b1(1).build());

    }
}
Run Code Online (Sandbox Code Playgroud)

一个旁注,@SuperBuilder 注释在撰写此答案时在 IntelliJ 中不起作用。如果您有多层继承,请避免 Lombok,否则它会使您的 Java 模型变得混乱。

  • 需要澄清的是,这不允许执行“A.builder()”和“B.builder()”。 (2认同)

Ana*_*ika 5

Lombok 在 version: 1.18.2 中引入了实验性功能,用于 Builder 注解面临的继承问题,可以通过 @SuperBuilder 注解解决

请使用lombok版本:1.18.2,子/父类中的@SuperBuilder注解