【问题标题】:Inheritance for builders in lombok龙目岛建设者的继承
【发布时间】:2023-04-10 11:29:02
【问题描述】:

我试图在我的项目中使用 lombok。

我有一个 A 类:

@Data
@Builder
public class A {
    Integer a1;
}

还有一个 B 类:

@Data
public class B extends A {
    Integer b1;

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

我收到一条错误消息,指出 B 中的 builder() 无法覆盖 A 中的 builder(),因为 BBuilder 中的返回类型与 ABuilder 中的返回类型不兼容。

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

PS:由于Issue,我已经为 B 类提供了显式构造函数。 我尝试搜索,但找不到相同的好解决方案。

【问题讨论】:

    标签: java inheritance design-patterns builder lombok


    【解决方案1】:

    这里我们只需要调用builder的super即可。

    @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();
                }
        }
    }
    

    【讨论】:

    • 如果父类也有@Builder注解,这个解决方案将不起作用。
    【解决方案2】:

    如果您将 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());
    
        }
    }
    

    附带说明,@SuperBuilder 注释在编写此答案时在 IntelliJ 中不起作用。如果您有多级继承,请避免使用 Lombok,否则会使您的 Java 模型混乱。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        将父母和孩子都作为@Builder 是行不通的。

        父类A:

        @Data
        @SuperBuilder
        public class A {
            Integer a1;
        }
        

        B 类儿童:

        @Data
        @SuperBuilder
        public class B extends A {
            Integer b1;
        }
        

        【讨论】:

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