簡體   English   中英

Lombok @Builder 不創建不可變對象?

[英]Lombok @Builder does not create immutable objects?

在許多站點中,我看到 lombok @Builder 可用於創建不可變對象( https://www.baeldung.com/lombok-builder-singular ),也有許多站點說 Builder 模式主要用於創建不可變對象。

TimeIntervalData td = TimeIntervalData.builder().endTime("12:00").startTime("10:00").build();
td.setEndTime("14:00");
System.out.println(td.getEndTime());

我不確定如何在使用構建器構建的對象上使用設置器。 我在這里缺少什么嗎?

是的,lombok builder 不會創建不可變實例,因為用戶將 class 中的參數定義為final ,根據lombok.builder的文檔,@ @Builder允許您自動生成使 class 可實例化所需的代碼,例如:

Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();

根據文檔,它只創建內部 static class 具有相同的屬性,方法與外部 class 中提到的相同

使用 @Builder 注釋的方法(從現在開始稱為目標)會導致生成以下 7 件事:

  • 一個名為 FooBuilder 的內部 static class,其類型與 arguments 相同(方法稱為 Ebuilder)。
  • 在構建器中:目標的每個參數都有一個私有的非靜態非最終字段。
  • 在構建器中:一個 package 私有無參數空構造函數。
  • 在構建器中:目標的每個參數的類似“setter”的方法:它與該參數具有相同的類型和相同的名稱。 它返回構建器本身,以便可以鏈接設置器調用
  • 在構建器中:調用該方法的 build() 方法,傳入每個字段。 它返回與目標返回相同的類型
  • 在構建器中:一個明智的 toString() 實現。
  • 在包含目標的 class 中: builder() 方法,它創建構建器的新實例。

但是對集合屬性使用帶有@Builder注釋的@Builder會使它們成為 singleton

通過使用@Singular 注釋來注釋參數之一(如果使用@Builder 注釋方法或構造函數)或字段(如果使用@Builder 注釋class),lombok 會將該構建器節點視為一個集合,並生成 2'adder ' 方法而不是 'setter' 方法。 一種將單個元素添加到集合中,另一種將另一個集合的所有元素添加到集合中。 不會生成僅設置集合(替換已添加的任何內容)的設置器。

@Singular 只能應用於 lombok 已知的集合類型。

主要用於創建不可變對象

這種說法是不正確的。 主要目的是減少樣板代碼。 使用 builder 創建 object 更緊湊,更易於編寫和閱讀。

當你有 1-2 個屬性時,builder 可能是不利的,並且與通過構造函數傳遞參數相比,它會使代碼的可讀性降低。

因此,何時使用或不使用 builder 是個人喜好問題。

對setter:如果需要setter,可以通過@Data注解生成。

暫無
暫無

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

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