@With
不可變的 'setter' - 建立物件副本但僅變更一個欄位的方法。
@Wither
在 lombok v0.11.4 中作為實驗性功能引入。
@Wither
在 lombok v1.18.10 中更名為 @With
,並從實驗性套件移至核心套件。
總覽
對於不可變屬性來說,setter 之外的下一個最佳替代方案是建構物件的副本,但此副本中只有一個欄位具有新值。產生此副本的方法正是 @With
所產生的:一個 withFieldName(newValue)
方法,它會產生一個副本,但關聯欄位的值會是新值。
例如,如果您建立 public class Point { private final int x, y; }
,setter 就沒有意義,因為欄位是 final 的。@With
可以為您產生一個 withX(int newXValue)
方法,它將傳回一個新的 point,其 x
值為提供的值,而 y
值保持不變。
@With
依賴所有欄位的建構子才能運作。如果此建構子不存在,您的 @With
註解將導致編譯時期錯誤訊息。您可以使用 Lombok 自己的 @AllArgsConstructor
,或者由於 Value
也會自動產生所有引數的建構子,因此您也可以使用它。當然,如果您手動編寫此建構子,也是可以接受的。它必須包含所有非靜態欄位,且順序必須與詞法順序相同。
與 @Setter
類似,您可以指定存取層級,以防您希望產生的 with 方法不是 public
@With(level = AccessLevel.PROTECTED)
。與 @Setter
類似,您也可以將 @With
註解放在類型上,這表示會為每個欄位產生一個 with
方法 (即使是非 final 欄位)。
若要將註解放在產生的方法上,您可以使用 onMethod=@__({@AnnotationsHere})
。但請注意!這是一項實驗性功能。如需更多詳細資訊,請參閱關於 onX 功能的文件。
欄位上的 javadoc 將複製到產生的 with 方法。通常,所有文字都會被複製,而 @param
會移動到 with 方法,而 @return
行則會從 with 方法的 javadoc 中移除。「移動」表示:從欄位的 javadoc 中刪除。也可以為 with 方法的 javadoc 定義唯一的文字。若要執行此操作,您可以建立一個名為 WITH
的「區段」。區段是 javadoc 中的一行,其中包含 2 個或多個破折號,然後是文字 'WITH',然後是 2 個或多個破折號,且該行上沒有其他內容。如果您使用區段,則不再對該區段執行 @return
和 @param
移除/複製 (將 @param
行移至區段中)。
使用 Lombok
import lombok.AccessLevel;
|
原生 Java
import lombok.NonNull;
|
支援的組態金鑰
-
lombok.accessors.prefix
+= 欄位前綴 (預設值:空清單) - 這是一個清單屬性;可以使用
+=
運算子新增項目。可以使用-=
運算子移除來自父組態檔的繼承前綴。Lombok 將從欄位名稱中移除任何相符的欄位前綴,以判斷要產生的 getter/setter 的名稱。例如,如果m
是此設定中列出的前綴之一,則名為mFoobar
的欄位將產生名為getFoobar()
的 getter,而不是getMFoobar()
。明確設定的@Accessors
註解的prefix
參數優先於此設定。 -
lombok.accessors.capitalization
= [basic
|beanspec
] (預設值:basic) - 控制如何將
uShaped
(一個小寫字母後跟一個大寫/首字大寫字母) 等棘手情況大寫。basic
將其大寫為withUShaped
,而beanspec
則將其大寫為withuShaped
。
這兩種策略在 java 生態系統中都很常用,但beanspec
更常見。 -
lombok.with.flagUsage
= [warning
|error
] (預設值:未設定) - 如果已設定,Lombok 將把任何
@With
的使用標記為警告或錯誤。
小字印刷
無法為靜態欄位產生 with 方法,因為這沒有意義。
可以為抽象類別產生 with 方法,但這會產生具有適當簽章的抽象方法。
將 @With
套用至類型時,將會略過靜態欄位和名稱以 $ 開頭的欄位。
為了產生方法名稱,欄位的第一個字元 (如果是小寫字元) 會轉換為首字大寫,否則會保持不修改。然後,會加上前綴 with
。
如果已存在任何具有相同名稱 (不區分大小寫) 和相同參數計數的方法,則不會產生任何方法。例如,即使從技術上來說可以建立方法,但如果已經有一個方法 withX(String... x)
,則不會產生 withX(int x)
。存在此注意事項是為了避免混淆。如果由於此原因而跳過方法的產生,則會改為發出警告。Varargs 算作 0 到 N 個參數。
關於 null 值的各種知名註解會導致插入 null 值檢查,並將複製到參數。如需更多資訊,請參閱 Getter/Setter 文件的「小字印刷」。
如果您已透過 lombok.config
金鑰 lombok.addNullAnnotations
設定了 null 值註解風格,則方法或傳回類型 (視所選風格而定) 將使用非 null 值註解進行註解。