[英]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 )
我們一直在類本身上使用@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.