【lombok】@NoArgsConstructor/@RequirArgsConstructor/@AllArgsConstructor - 生成無參構造器,指定引數構造器或包含所有引數的構造器
這三個註解的集合接受某些欄位的一個引數,簡單的用於分配這個引數給這個欄位。
@NoArgsConstructor
生成的構造器無引數。如果這是不可能的(因為有final欄位),則會導致編譯錯誤。
除非使用@NoArgsConstructor(force=true)
,然後將所有的final欄位都初始化為0
/false
/null
。
對於有約束的欄位,比如@NonNull
,不會生成任何檢查,所以請注意直到這些欄位都適當的被初始化後,才會滿足這些約束條件。
某些java構造器,比如hibernate和服務提供介面需要無參構造器。這個註解主要同@Data
或者其他生成構造器的註解一起使用。
@RequirArgsConstructor
為每個需要特殊處理的欄位生成一個欄位與引數對應的構造器。所有未初始化的final欄位都獲得一個引數,
以及標識為@NonNull
的任何欄位,這些欄位在申明它們時未初始化。對於這些標記為@NonNull
的欄位,明確的Null檢查也會跟著生成。
如果任意標記@NonNull
欄位的引數包含null
,則構造器會丟擲空指標異常。這些引數的排序同這些欄位在類裡出現的順序一致。
@AllArgsConstructor
在你的類中生成一個將所有欄位作為引數的構造器。標記為@NonNull
的欄位將生成對應的null檢查。
所有的這些註解都支援替換格式,生成的構造器都是私用的,然後會生成一個額外的封裝私有構造器的靜態工廠方法。
這個模式通過在註解內使用staticName
開啟,比如@RequiredArgsConstructor(staticName="of")
。和普通構造器不一樣,
該靜態工廠方法可以推斷泛型。也就是說你的API呼叫方可以使用MapEntry.of("foo", 5)
而不是new MapEntry<String, Integer>("foo", 5)
。
想要將註解放置在生成的構造器上,可以通過使用onConstructor=@__({@AnnotationsHere})
,但是請小心,這只是一個實驗階段功能。
更多的資訊請參考文件的onX
功能。
這些註解會跳過靜態欄位。
同其他lombok註解不一樣的是,指定構造器的出現不會阻礙這些註解生成它們自己的構造器。這也意味著你可以編寫你自己專門的構造器,
並讓lombok生成樣板檔案。如果出現衝突(專門的構造器和lombok生成的簽名一致),會引發編譯錯誤。
使用Lombok
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.NonNull;
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample<T> {
private int x, y;
@NonNull private T description;
@NoArgsConstructor
public static class NoArgsExample {
@NonNull private String field;
}
}
不使用Lombok
public class ConstructorExample<T> {
private int x, y;
@NonNull private T description;
private ConstructorExample(T description) {
if (description == null) throw new NullPointerException("description");
this.description = description;
}
public static <T> ConstructorExample<T> of(T description) {
return new ConstructorExample<T>(description);
}
@java.beans.ConstructorProperties({"x", "y", "description"})
protected ConstructorExample(int x, int y, T description) {
if (description == null) throw new NullPointerException("description");
this.x = x;
this.y = y;
this.description = description;
}
public static class NoArgsExample {
@NonNull private String field;
public NoArgsExample() {
}
}
}
相關文章
- iOS提供指定構造器iOS
- 構造器
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- Java--構造器和構造方法Java構造方法
- java構造器Java
- 日曆(設計構造器與預設構造器)
- (譯)Effective Kotlin系列之遇到多個構造器引數要考慮使用構建器(二)Kotlin
- 14.構造器
- 構造有理數~
- Java構造器 小白版Java
- 什麼是 Java 構造器?Java
- 物件導向和構造器物件
- 訪問器於構造器的高階使用
- Day31--構造器詳解
- this,構造器,static,final,單例模式單例模式
- 理解 sole() 查詢構造器方法
- java學習之深入構造器Java
- MyBatis-plus 自動生成 條件構造器 QueryWrapperMyBatisAPP
- 一文了解 Java 中的構造器Java
- 03_方法引用與構造器引用
- Effective Java - 靜態方法與構造器Java
- 621. 任務排程器 (構造)
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- Mybatis-Plus - 條件構造器 QueryWrapper 的使用MyBatisAPP
- 構造器中呼叫動態繫結的方法
- c語言 構造素數表C語言
- 構造方法構造方法
- Java基礎03 構造器與方法過載Java
- Effective Java - 構造器私有、列舉和單例Java單例
- 使用 Laravel Eloquent 構造器讓模型更簡潔Laravel模型
- 構造點,線結構
- 小解惑:查詢構造器與集合中的 get 方法
- 使用openSSL構造一個支援https的nodejs伺服器HTTPNodeJS伺服器
- Springboot在包含有參構造方法的類中使用@Value註解取值Spring Boot構造方法
- 十七、物件的構造物件
- 構造器引用和直接用new建立物件區別物件
- CF 構造題
- AUTOCAD——構造線