我想要擁有不可變的 myClass 對象。好的解決方案是使用 @Singular 注釋。問題是,當我使用此注釋時,方法 elements() 將元素附加到現有列表,而不是創建新列表:假設我們有:@Value@Builder(toBuilder = true)public class MyClass { @Singular private List<String> elemets;}和MyClass.builder().elemets(Arrays.asList("elem1")).elemets(Arrays.asList("elem2")).build();如果沒有 @Singular 注釋,我們的列表中有 elem2,如果有 @Singular 注釋,我們就有 elem1 和 elem2,如果我只想有 elem2,我必須先使用clearElements()。為什么實施方式不同?是否可以在我自己的實現中使用@Singular?使用 @Singular 注釋,我無法在 MyClassBuilder 類中實現 elemets(List elemets) 方法,因為我得到:“不支持手動添加 @Singular @Builder 將生成的方法。如果您想手動管理此字段/參數的構建器方面,不要使用@Singular?!?
1 回答

白衣染霜花
TA貢獻1796條經驗 獲得超10個贊
首先我要說的是,使用@Singular
不一定是最好的解決方案——這取決于您的用例。但是,在大多數情況下,如果您希望確保使用集合的類的不變性,那么這是一個不錯的選擇。
@Singular
其行為方式是因為 Lombok 設計師認為這樣做是一個不錯的選擇。我同意:它使兩個 setter 方法的行為相似;在極少數情況下,您想要重置構建器中的元素,您可以使用該clear
方法。
@Singular
生成相當復雜的代碼,這是為了確保效率和不變性等屬性(也在重用構建器來生成多個對象時)。當您修改該代碼時,很容易違反這些屬性。Lombok 阻止你這樣做。
如果你真的想修改這方面,你有三個選擇:
delombok
構建器代碼,將其復制到您的類中,然后修改它。添加另一個不同名稱的方法,例如
clearAndSetElements(List<String>)
.?但這可能更令人困惑。@Singular
自行刪除并實現 setter 方法。如果你想要 Lombok 實現的特性,你就必須在實現上付出一些努力;您可以使用delombok
ed 代碼作為靈感。
添加回答
舉報
0/150
提交
取消