@Data
現在整合在一起:@ToString
、@EqualsAndHashCode
、所有欄位的 @Getter
、所有非 final 欄位的 @Setter
和 @RequiredArgsConstructor
的捷徑!
概觀
@Data
是一個方便的捷徑註解,它將 @ToString
、@EqualsAndHashCode
、@Getter
/ @Setter
和 @RequiredArgsConstructor
的功能捆綁在一起:換句話說,@Data
會產生所有通常與簡單 POJO (Plain Old Java Objects) 和 beans 相關的樣板程式碼:所有欄位的 getter、所有非 final 欄位的 setter,以及包含類別欄位的適當 toString
、equals
和 hashCode
實作,以及一個建構子,用於初始化所有 final 欄位,以及所有沒有初始設定式且標記為 @NonNull
的非 final 欄位,以確保欄位永遠不會是 null。
@Data
就像在類別上隱含地使用 @Getter
、@Setter
、@ToString
、@EqualsAndHashCode
和 @RequiredArgsConstructor
註解一樣(除非已存在任何明確撰寫的建構子,否則不會產生建構子)。然而,這些註解的參數(例如 callSuper
、includeFieldNames
和 exclude
)無法使用 @Data
設定。如果您需要為這些參數設定非預設值,只需明確地新增這些註解即可;@Data
夠聰明,可以將這些註解延後處理。
所有產生的 getter 和 setter 都會是 public
。若要覆寫存取層級,請使用明確的 @Setter
和/或 @Getter
註解標註欄位或類別。您也可以使用此註解(將其與 AccessLevel.NONE
結合使用)完全禁止產生 getter 和/或 setter。
所有標記為 transient
的欄位都不會被納入 hashCode
和 equals
的考量。所有 static 欄位都會完全跳過(不會被納入任何產生的方法考量,也不會為它們建立 setter/getter)。
如果類別已經包含一個方法,其名稱和參數計數與任何通常會產生方法相同,則該方法不會產生,且不會發出警告或錯誤。例如,如果您已經有一個簽章為 equals(AnyType param)
的方法,則不會產生 equals
方法,即使從技術上來說,由於參數類型不同,它可能是一個完全不同的方法。相同的規則適用於建構子(任何明確的建構子都會阻止 @Data
產生一個建構子),以及 toString
、equals
和所有 getter 和 setter。您可以使用 @lombok.experimental.Tolerate
標記任何建構子或方法,以將它們從 lombok 中隱藏起來。
@Data
可以很好地處理欄位的泛型參數。為了減少為具有泛型的類別建構物件時的樣板程式碼,您可以使用 staticConstructor
參數來產生私有建構子,以及一個傳回新實例的靜態方法。這樣,javac 就會推斷變數名稱。因此,透過像這樣宣告:@Data(staticConstructor="of") class Foo<T> { private T x;}
,您可以透過撰寫 Foo.of(5);
來建立 Foo
的新實例,而不是必須撰寫 new Foo<Integer>(5);
。
使用 Lombok
import lombok.AccessLevel;
|
Vanilla Java
import java.util.Arrays;
|
支援的組態金鑰
-
lombok.data.flagUsage
= [warning
|error
] (預設值:未設定) - 如果已設定,Lombok 會將任何
@Data
的使用情況標記為警告或錯誤。 -
lombok.noArgsConstructor.extraPrivate
= [true
|false
] (預設值:false) - 如果為
true
,lombok 會為任何@Data
註解的類別產生一個私有的無參數建構子,該建構子會將所有欄位設定為預設值 (null / 0 / false)。
小字細則
請參閱 @ToString
、@EqualsAndHashCode
、@Getter / @Setter
和 @RequiredArgsConstructor 的小字細則。
關於 null 值的各種著名註解會導致插入 null 值檢查,並將複製到相關位置(例如 getter 的方法,以及建構子和 setter 的參數)。請參閱 Getter/Setter 文件的小字細則以取得更多資訊。
預設情況下,任何以 $ 符號開頭的變數都會自動排除。您可以透過指定明確的註解(例如 @Getter
或 @ToString
)並使用 'of' 參數來包含它們。