簡體   English   中英

龍目島建設者的繼承

[英]Inheritance for builders in lombok

我試圖在我的項目中使用 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:由於問題,我已經為 B 類提供了顯式構造函數。 我嘗試搜索,但找不到相同的好的解決方案。

這里我們只需要調用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();
            }
    }
}

如果您將 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 模型變得混亂。

Lombok 在 version: 1.18.2 中引入了實驗性功能,用於 Builder 注解面臨的繼承問題,可以通過 @SuperBuilder 注解解決

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

如果你的父類已經有@Builder ,那么你的孩子應該用@SuperBuilder標記。

將父母和孩子都作為@Builder行不通的。

父類A:

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

兒童班B:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM