@Delegate
不要失去你的組合。
@Delegate
在 lombok v0.10 版本中作為一個功能被引入(當時實驗性套件尚不存在)。
它在 lombok v1.14 中被移至實驗性套件;主 lombok 套件中的舊版本現在已被棄用。
實驗性
實驗性是因為- 使用不多。
- 難以支援邊緣情況,例如遞迴委派。
- API 相對不友善;如果您可以簡單地實作一些方法,並讓
@Delegate
為您沒有手動實作的任何內容生成委派,那會更好,但由於泛型擦除的問題,這也無法在沒有但書的情況下運作。
概觀
任何欄位或無參數方法都可以使用 @Delegate
註解,以讓 lombok 生成委派方法,將呼叫轉發到此欄位(或調用此方法的結果)。
Lombok 委派欄位類型(或方法的回傳類型)的所有 public
方法,以及其父類型的方法,但不包括在 java.lang.Object
中宣告的所有方法。
您可以將任意數量的類別傳遞到 @Delegate
註解的 types
參數中。如果您這樣做,那麼 lombok 將委派這些類型(及其父類型,除了 java.lang.Object
)中的所有 public
方法,而不是查看欄位/方法的類型。
所有屬於計算類型一部分的 public 非 Object
方法都會被複製,無論您是否也為這些方法編寫了實作。這將導致重複的方法錯誤。您可以使用 @Delegate(excludes=SomeType.class)
參數來避免這些錯誤,以排除排除類型及其父類型中的所有 public 方法。
為了非常精確地控制委派和不委派的內容,請編寫帶有方法簽名的私有內部介面,然後在 @Delegate(types=PrivateInnerInterfaceWithIncludesList.class, excludes=SameForExcludes.class)
中將這些私有內部介面指定為類型。
使用 Lombok
import java.util.ArrayList;
|
Vanilla Java
import java.util.ArrayList;
|
支援的配置鍵
-
lombok.delegate.flagUsage
= [`warning` | `error`] (預設值:未設定) - 如果配置,Lombok 會將任何
@Delegate
的使用標記為警告或錯誤。
小字說明
當將類別傳遞到註解的 types
或 excludes
參數時,您不能包含泛型。這是 java 的限制。使用私有內部介面或擴展包含泛型參數的目標類型的類別來解決此問題。
當將類別傳遞到註解時,這些類別不需要是欄位的父類型。請參閱範例。
@Delegate
不能用於靜態欄位或方法。
當要委派/排除的計算類型本身包含 @Delegate
註解時,不能使用 @Delegate
;換句話說,如果您嘗試遞迴使用它,@Delegate
將會出錯。