簡體   English   中英

lombok @Builder 是否允許擴展

[英]Does lombok @Builder allow extends

我有2個班級:

import lombok.Builder;
@Builder
public class B extends A {
}

import lombok.Builder;
@Builder
public class A {
}

B上的@Builder上,我收到消息:

返回類型與 A.builder() 不兼容。

這是lombok的限制嗎? 或者我做錯了什么?

如果我將@Builder留在A ,那么B上的 Builder 似乎不會考慮B的構造函數中A中的字段。

最新的 lombok 版本 1.18.2 包括新的實驗性@SuperBuilder 它支持來自超類(也是抽象類)的繼承和字段。 唯一的要求是所有超類都必須有@SuperBuilder注釋。 有了它,解決方案就這么簡單:

@SuperBuilder
public class B extends A {
   private String b;
}

@SuperBuilder
public class A {
    private String a;
}

B instance = B.builder().b("b").a("a").build();

只有一種解決方法才有可能(見#78

來自Reinhard.codes

我們一直在類本身上使用@Builder,但您也可以將它放在類的構造函數或靜態方法上。 在這種情況下,Lombok 將為構造函數/方法的每個參數在構建器類上創建一個 setter 方法。 這意味着您可以為類的所有字段(包括其超類)創建一個帶有參數的自定義構造函數。

@AllArgsConstructor
public class Parent {
  private String a;
}

public class Child extends Parent {

  private String b;

  @Builder
  private Child(String a, String b){
    super(a);
    this.b = b;
  }
}

我無法再重現您的確切問題,但這可能是因為 Lombok 已經進化。

但是,您的部分問題是 be 的構建器不包括 a 的字段。 這仍然是正確的, @AllArgsConstructor也是@AllArgsConstructor 繼承不是龍目島的強項。

Thad 說,由於您可以自己編寫構造函數並可以將@Builder放在構造函數上,因此以下內容將按照您的意願為 B 生成一個構建器:

@Builder
public class A {
    String a;
}

public class B extends A {

    @Builder
    B(String a, String b) {
        super(a);
        this.b = b;
    }

    String b;
}

使用帶有 java 繼承的 lombok 遇到問題,在父類和子類上使用以下注釋后解決:

@EqualsAndHashCode(callSuper = true)

@SuperBuilder

@數據

@AllArgsConstructor

@NoArgsConstructor

在不知道 lombok 的實現細節或嘗試它的情況下,我會說不,因為模式不允許。

如果您實現構建器模式,則所有方法( build() 除外)將始終將構建器存在的類作為返回類型。

這意味着類 A 的方法只會返回 A。B 總是返回 B。如果現在讓 B 從 A 擴展,它不會覆蓋 A 的方法,因為它的返回類型不匹配。 反之亦然,它無法實現 B 中的構建器方法,因為這些方法已經存在於 A 中。它們不能通過 OOP 設計共存。

您也許能夠創建通用構建器,但這並不能解決問題。 如果您真的需要從 A 擴展,那么您的問題可能來自另一個構建器模式無法解決的設計決策。

我假設不是擴展類,而是在 lombok 應該支持的構建器中使用默認值。 這些默認值然后反映了默認情況下 A 類可能支持的內容。 在您希望讓 B 做事的用例中,您可以調用構建器方法並覆蓋這些默認值。

編輯:哦,也許看看這里

暫無
暫無

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

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