亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在帶有和不帶有 @Singular 注釋的 Collection 字段上使用復數方法時的不同效果

在帶有和不帶有 @Singular 注釋的 Collection 字段上使用復數方法時的不同效果

PIPIONE 2023-06-28 15:56:58
我想要擁有不可變的 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 實現的特性,你就必須在實現上付出一些努力;您可以使用delomboked 代碼作為靈感。


查看完整回答
反對 回復 2023-06-28
  • 1 回答
  • 0 關注
  • 242 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號