@SuperBuilder
Bob 現在知道他的祖先了:建構器也包含來自父類別的欄位。
@SuperBuilder
在 lombok v1.18.2 版本中以實驗性功能推出。
@SuperBuilder
的 toBuilder
功能和有限的客製化支援在 lombok v1.18.4 版本中新增。
@SuperBuilder
的客製化可能性在 lombok v1.18.14 版本中擴展。
總覽
@SuperBuilder
註解為您的類別產生複雜的建構器 API。與 @Builder
相反,@SuperBuilder
也適用於父類別的欄位。然而,它僅適用於類型。最重要的是,它要求*所有父類別*也必須具有 @SuperBuilder
註解。
@SuperBuilder
讓您自動產生所需的程式碼,以便使用如下程式碼實例化您的類別:
Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
@SuperBuilder
可以為集合參數/欄位產生所謂的「單數」方法。詳情請參閱 @Builder
中 @Singular
的文件。
@SuperBuilder
在類別上產生一個受保護的建構子,該建構子將建構器實例作為參數。此建構子將新實例的欄位設定為來自建構器的值。
@SuperBuilder
與 @Builder
不相容。
您可以使用 @SuperBuilder(toBuilder = true)
在您的類別中也產生一個名為 toBuilder()
的實例方法;它建立一個新的建構器,該建構器以該實例的所有值開始。使用 toBuilder
要求所有父類別也必須具有 toBuilder = true
。您可以將 @Builder.ObtainVia
註解放在欄位上,以指示從此實例取得該欄位/參數值的替代方法。例如,您可以指定要調用的方法:@Builder.ObtainVia(method = "calculateFoo")
。
為了確保型別安全,@SuperBuilder
為每個註解類別產生兩個內部建構器類別,一個抽象類別和一個具體類別,分別命名為 FoobarBuilder
和 FoobarBuilderImpl
(其中 Foobar 是註解類別的名稱)。
您可以客製化 @SuperBuilder
產生的大部分程式碼,除了內部方法(例如 self()
)。您必須確保建構器類別宣告標頭與 lombok 將產生的標頭相符。由於大量使用泛型,我們強烈建議在客製化 @SuperBuilder
時,以未客製化的 delomboked 程式碼 作為參考。
建構器的可配置方面包括:
- *build()* 方法的名稱(預設值:
"build"
) - *builder()* 方法的名稱(預設值:
"builder"
) - 是否要
toBuilder()
(預設值:否) - (不建議)如果您希望建構器的 'set' 方法具有前綴,例如
Person.builder().setName("Jane").build()
而不是Person.builder().name("Jane").build()
,以及應該是什麼。
@SuperBuilder(buildMethodName = "execute", builderMethodName = "helloWorld", toBuilder = true, setterPrefix = "set")
想要將您的 superbuilder 與 JSON/XML 工具 Jackson 一起使用嗎?我們為您準備好了:查看 @Jacksonized 功能。
支援的配置鍵:
-
lombok.builder.className
= [一個 Java 識別符,帶有一個可選的星號來指示返回類型名稱的位置](預設值:*Builder
) - 這是產生的建構器類別的名稱;名稱中的任何星號都會被替換為相關的返回類型。請注意,父類別也必須具有相同的設定(整個使用
@SuperBuilder
註解的類型層次結構都需要相同的設定)。 -
lombok.superBuilder.flagUsage
= [warning
|error
](預設值:未設定) - 如果配置了,Lombok 會將任何
@SuperBuilder
的使用標記為警告或錯誤。 -
lombok.singular.useGuava
= [true
|false
](預設值:false) - 如果為
true
,lombok 將使用 guava 的ImmutableXxx
建構器和類型來實作java.util
集合介面,而不是建立基於Collections.unmodifiableXxx
的實作。如果您使用此設定,則必須確保 guava 實際上在 classpath 和 buildpath 上可用。如果您的欄位/參數具有 guavaImmutableXxx
類型之一,則會自動使用 Guava。 -
lombok.singular.auto
= [true
|false
](預設值:true) - 如果為
true
(預設值),lombok 會自動嘗試將您的識別符名稱單數化,方法是假設它是一個常見的英文複數。如果為false
,您必須始終明確指定單數名稱,如果您不這樣做,lombok 將產生錯誤(如果您使用英語以外的語言編寫程式碼,則很有用)。
小字說明
產生的建構器程式碼嚴重依賴泛型,以避免在使用建構器時進行類別轉換。
有關 @Singular
的註解,請參閱 @Builder
文件的小字說明。
關於空值的各種廣為人知的註解會導致插入空值檢查,並將複製到建構器的 'setter' 方法的參數。有關更多資訊,請參閱 Getter/Setter 文件的小字說明。