@ExtensionMethod
API 令人困擾?自己修復:為現有類型新增方法!
@ExtensionMethod
在 lombok v0.11.2 中作為實驗性功能引入。
實驗性
實驗性原因:- 對程式碼風格影響很大。
- 非常希望提供實用方法來擴充常用類別,但到目前為止,lombok 沒有針對此類執行階段依賴性提供良好的發布方法。
- 對 Eclipse 影響頗大,且自動完成功能(例如)在 Netbeans 中尚無法運作。
- @ExtensionMethod 應該允許用於方法嗎?應該允許用於套件嗎?
- 此功能相關的錯誤比我們預期的多,而且維護負擔很重。
概觀
您可以建立一個類別,其中包含一堆 public
、static
方法,這些方法都至少接受 1 個參數。這些方法將擴充第一個參數的類型,就像它們是實例方法一樣,使用 @ExtensionMethod
功能。
例如,如果您建立 public static String toTitleCase(String in) { ... }
,您可以使用 @ExtensionMethod
功能,使其看起來像 java.lang.String
類別有一個名為 toTitleCase
的方法,該方法沒有引數。靜態方法的第一個引數在實例方法中扮演 this
的角色。
所有 public
、static
且至少有 1 個非原始類型引數的方法,都會被視為擴充方法,並且每個方法都會被注入到第一個參數的類型命名空間中,就像它們是實例方法一樣。如上述範例所示,看起來像這樣的呼叫:foo.toTitleCase()
會被替換為 ClassContainingYourExtensionMethod.toTitleCase(foo);
。請注意,如果 foo
為 null,實際上不會立即發生 NullPointerException
- 它會像任何其他參數一樣傳遞。
您可以將任意數量的類別傳遞給 @ExtensionMethod
注釋;將會搜尋所有類別以尋找擴充方法。這些擴充方法適用於註解類別中的任何程式碼。
Lombok 目前沒有任何執行階段依賴性,這表示 lombok 目前沒有附帶任何有用的擴充方法,因此您必須自行建立。不過,這裡有一個可能會激發您的想像力
public class ObjectExtensions { public static <T> T or(T object, T ifNull) { return object != null ? object : ifNull; } }
使用上述類別,如果您將 @ExtensionMethod(ObjectExtensions.class)
新增至您的類別定義,您可以寫入
String x = null; System.out.println(x.or("Hello, World!"));
上述程式碼不會因
NullPointerException
而失敗;它實際上會輸出 Hello, World!
使用 Lombok
import lombok.experimental.ExtensionMethod;
|
原生 Java
public class ExtensionMethodExample {
|
支援的組態金鑰
-
lombok.extensionMethod.flagUsage
= [warning
|error
] (預設值:未設定) - 如果已設定,Lombok 會將任何
@ExtensionMethod
的使用標記為警告或錯誤。
小字聲明
呼叫會被重寫為對擴充方法的呼叫;靜態方法本身不會內聯。因此,擴充方法必須同時存在於編譯時和執行時。
泛型完全適用於找出擴充方法。也就是說,如果您的擴充方法的第一個參數是 List<? extends String>
,則任何與其相容的表達式都將具有您的擴充方法,但其他種類的列表則不會。因此,List<Object>
不會取得它,但 List<String>
會。