@Value
讓不可變類別變得非常容易。
@Value
在 lombok v0.11.4 中作為實驗性功能引入。
自 lombok v0.11.8 起,@Value
不再暗示 @With
。
自 lombok v0.12.0 起,@Value
提升至主要的 lombok
套件。
概觀
@Value
是 @Data
的不可變變體;所有欄位預設設為 private
和 final
,且不會產生 setter。類別本身預設也會設為 final
,因為不可變性無法強制套用於子類別。與 @Data
類似,也會產生有用的 toString()
、equals()
和 hashCode()
方法,每個欄位都會取得 getter 方法,並且也會產生涵蓋每個引數的建構子(除了在欄位宣告中初始化的 final
欄位之外)。
實際上,@Value
是以下項目的簡寫:final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter
,除非明確包含任何相關方法的實作,否則表示該部分將不會產生,並且不會發出警告。例如,如果您撰寫自己的 toString
,則不會發生錯誤,並且 lombok 不會產生 toString
。此外,任何明確的建構子,無論引數列表為何,都表示 lombok 不會產生建構子。如果您希望 lombok 產生所有引數建構子,請將 @AllArgsConstructor
新增至類別。請注意,如果類別上同時有 `@Builder` 和 `@Value`,則 `@Builder` 想要建立的套件私有所有引數建構子會「勝過」`@Value` 想要建立的公有建構子。您可以使用 @lombok.experimental.Tolerate
標記任何建構子或方法,以將它們從 lombok 中隱藏起來。
可以使用欄位上的明確存取層級,或使用 @NonFinal
或 @PackagePrivate
註解來覆寫預設為 final 和預設為 private 的行為。@NonFinal
也可以在類別上使用,以移除 final 關鍵字。
可以透過明確使用該註解來覆寫構成 @Value
的任何「部分」的任何預設行為。
使用 Lombok
import lombok.AccessLevel;
|
原生 Java
import java.util.Arrays;
|
支援的配置鍵
-
lombok.value.flagUsage
= [warning
|error
] (預設值:未設定) - 如果已配置,Lombok 將會把任何
@Value
的使用標記為警告或錯誤。 -
lombok.noArgsConstructor.extraPrivate
= [true
|false
] (預設值:false) - 如果為
true
,lombok 將為任何@Value
註解的類別產生一個私有的無引數建構子,該建構子會將所有欄位設定為預設值 (null / 0 / false)。
小字印刷
尋找關於 @Value
的「組成部分」的文件:@ToString
、@EqualsAndHashCode
、@AllArgsConstructor
、@FieldDefaults
和 @Getter
。
對於具有泛型的類別,擁有一個充當建構子的靜態方法很有用,因為透過靜態方法推斷泛型參數在 java6 中有效,並且避免必須使用菱形運算子。雖然您可以透過套用明確的 @AllArgsConstructor(staticConstructor="of")
註解來強制執行此操作,但還有 @Value(staticConstructor="of")
功能,它會使產生的所有引數建構子成為私有的,並產生一個名為 of
的公有靜態方法,它是此私有建構子的包裝器。
關於空值的各種眾所周知的註解會導致插入空值檢查,並將複製到相關位置 (例如 getter 的方法,以及建構子和 setter 的參數)。 有關更多資訊,請參閱 Getter/Setter 文件的小字印刷。
@Value
從 v0.11.4 到 v0.11.9 (作為 @lombok.experimental.Value
) 是一個實驗性功能。 此後,它已移至核心套件中。 舊的註解仍然存在 (並且是一個別名)。 但它最終將在未來的版本中移除。
無法使用 @FieldDefaults
來「取消」註解類別中欄位的預設為 private 和預設為 final 的方面。 請在類別中的欄位上使用 @NonFinal
和 @PackagePrivate
來覆寫此行為。