@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor
客製化建構子:產生不帶引數、每個 final / non-null 欄位一個引數,或每個欄位一個引數的建構子。
概觀
這組 3 個註解會產生一個建構子,該建構子將為特定欄位接受 1 個參數,並簡單地將此參數指派給該欄位。
@NoArgsConstructor
將產生一個不帶參數的建構子。如果這不可能(由於 final 欄位),則會產生編譯器錯誤,除非使用 @NoArgsConstructor(force = true)
,然後所有 final 欄位都會初始化為 0
/ false
/ null
。對於具有約束的欄位,例如 @NonNull
欄位,不會產生檢查,因此請注意,這些約束通常在這些欄位稍後正確初始化之前不會被滿足。某些 Java 建構,例如 Hibernate 和 Service Provider Interface 需要一個無參數建構子。此註解主要與 @Data
或其他建構子產生註解之一結合使用時很有用。
@RequiredArgsConstructor
為每個需要特殊處理的欄位產生一個帶有 1 個參數的建構子。所有未初始化的 final
欄位都會獲得一個參數,以及任何標記為 @NonNull
且未在其宣告位置初始化的欄位。對於那些標記為 @NonNull
的欄位,也會產生明確的 null 檢查。如果任何用於標記為 @NonNull
的欄位的參數包含 null
,則建構子將拋出 NullPointerException
。參數的順序與欄位在類別中出現的順序相符。
@AllArgsConstructor
為類別中的每個欄位產生一個帶有 1 個參數的建構子。標記為 @NonNull
的欄位會導致對這些參數進行 null 檢查。
這些註解中的每一個都允許一種替代形式,其中產生的建構子始終是私有的,並且會產生一個額外的靜態 factory 方法,該方法包裝在私有建構子周圍。透過為註解提供 staticName
值來啟用此模式,例如:@RequiredArgsConstructor(staticName="of")
。與普通建構子不同,這種靜態 factory 方法會推斷泛型。這表示您的 API 使用者可以寫入 MapEntry.of("foo", 5)
,而不是更長的 new MapEntry<String, Integer>("foo", 5)
。
若要將註解放在產生的建構子上,您可以使用 onConstructor=@__({@AnnotationsHere})
,但請小心;這是一個實驗性功能。如需更多詳細資訊,請參閱 onX 功能的文件。
靜態欄位會被這些註解跳過。
與大多數其他 Lombok 註解不同,明確建構子的存在不會阻止這些註解產生它們自己的建構子。這表示您可以編寫自己的特殊建構子,並讓 Lombok 也產生樣板程式碼建構子。如果發生衝突(您的建構子之一最終與 Lombok 產生的建構子具有相同的簽名),則會發生編譯器錯誤。
使用 Lombok
import lombok.AccessLevel;
|
Vanilla Java
public class ConstructorExample<T> {
|
支援的配置鍵
-
lombok.anyConstructor.addConstructorProperties
= [true
|false
] (預設值:false
) - 如果設定為
true
,則 Lombok 會將@java.beans.ConstructorProperties
新增至產生的建構子。 -
lombok.
[allArgsConstructor
|requiredArgsConstructor
|noArgsConstructor
].flagUsage
= [warning
|error
] (預設值:未設定) - 如果配置,Lombok 會將任何相關註解 (
@AllArgsConstructor
、@RequiredArgsConstructor
或@NoArgsConstructor
) 的使用標記為警告或錯誤。 -
lombok.anyConstructor.flagUsage
= [warning
|error
] (預設值:未設定) - 如果配置,Lombok 會將任何建構子產生註解的使用標記為警告或錯誤。
-
lombok.copyableAnnotations
= [完整類型名稱列表] (預設值:空列表) - Lombok 會將這些註解中的任何一個從欄位複製到建構子參數、setter 參數和 getter 方法。請注意,Lombok 隨附了一堆「開箱即用」的註解,這些註解已知是可複製的:所有流行的可為 null/不可為 null 註解。
-
lombok.noArgsConstructor.extraPrivate
= [true
|false
] (預設值:false) - 如果
true
,Lombok 將為任何@Value
或@Data
註解的類別產生一個私有的無參數建構子,該建構子將所有欄位設定為預設值 (null / 0 / false)。
小字聲明
即使欄位明確使用 null
初始化,Lombok 也會認為避免 null 的要求已滿足,並且不會將該欄位視為「必要」引數。假設如果您明確將 null
指派給您也標記為 @NonNull
的欄位,則表示您必須知道自己在做什麼。
@java.beans.ConstructorProperties
註解永遠不會為不帶引數的建構子產生。這也解釋了為什麼 @NoArgsConstructor
缺少 suppressConstructorProperties
註解方法。產生的靜態 factory 方法也不會獲得 @ConstructorProperties
,因為此註解只能新增到真實的建構子。
@XArgsConstructor
也可以在 enum 定義上使用。產生的建構子將始終是私有的,因為非私有建構子在 enum 中是不合法的。您不必指定 AccessLevel.PRIVATE
。
關於 null 值的各種知名註解會導致插入 null 檢查,並將複製到參數。有關更多資訊,請參閱 Getter/Setter 文件的小字聲明。
當建構子由 @Data
、@Value
或任何其他 Lombok 註解產生時,flagUsage
配置鍵不會觸發。