onX
老兄,我們聽說你喜歡註解,所以我們在你的註解中放入了註解,這樣你就可以在註解的時候進行註解。
onX 在 lombok v0.11.8 中作為實驗性功能引入。
實驗性質
實驗性質,因為- 語法醜陋。此功能的語法並非最佳,但它是目前可能可行的最不複雜語法(暫時!)。
- Java 9 可能會提供(更好)的方式來支援此功能。
- 不確定性:未來版本的 javac 可能會破壞此功能,我們可能無法恢復它。
概觀
此功能被視為「權宜之計」狀態 - 它的存在是為了讓無法在沒有此功能的情況下工作的 lombok 使用者仍然可以使用它。如果我們找到更好的方法來實作此功能,或者未來的 java 版本引入替代策略,則此功能可能會在沒有合理的棄用期的情况下消失。此外,此功能可能在未來版本的 javac 中無法運作。請自行斟酌使用。
大多數讓 lombok 產生方法或建構子的註解可以配置為也讓 lombok 將自訂註解放在產生程式碼中的元素上。
@Getter
、@Setter
和 @Wither
支援 onMethod
選項,這會將列出的註解放在產生的方法上。
@AllArgsConstructor
、@NoArgsConstructor
和 @RequiredArgsConstructor
支援 onConstructor
選項,這會將列出的註解放在產生的建構子上。
除了 onMethod
之外,@Setter
和 @Wither
還支援 onParam
;列出的註解將放在產生方法擁有的唯一參數上。@EqualsAndHashCode
也支援 onParam
;列出的註解將放在產生的 equals
方法的單一參數上,以及任何產生的 canEqual
方法。
語法有點奇怪,並且取決於您使用的 javac 版本。
在 javac7 上,要使用 3 個 onX
功能中的任何一個,您必須將要應用於建構子/方法/參數的註解包裝在 @__(@AnnotationGoesHere)
中。要應用多個註解,請使用 @__({@Annotation1, @Annotation2})
。註解本身顯然也可以有參數。
在 javac8 及更高版本上,您在 onMethod
、onParam
或 onConstructor
之後新增一個底線。
使用 Lombok
import lombok.AllArgsConstructor;
|
原生 Java
import javax.inject.Inject;
|
支援的配置鍵
-
lombok.onX.flagUsage
= [warning
|error
] (預設值:未設定) - 如果配置,Lombok 將會把任何
onX
的使用標記為警告或錯誤。
小字聲明
奇怪語法的原因是為了讓此功能在 javac 7 編譯器中運作;@__
類型是對註解類型 __
(雙底線) 的註解參考,而 __
實際上並不存在;這使得 javac 7 因為錯誤而延遲中止編譯過程,因為註解處理器稍後可能會建立 __
類型。相反地,lombok 會套用註解並移除參考,以便永遠不會實際發生錯誤。重點是:__
類型絕對不能存在,否則此功能將無法運作。在 __
類型確實存在(並且已匯入或在套件中)的罕見情況下,您可以簡單地新增更多底線。從技術上講,任何不存在的類型都可以運作,但為了保持一致性和可讀性並捕獲錯誤使用,如果「包裝器」註解不是一系列底線,lombok 會將其視為錯誤。
在 javac8 中,上述功能應該可以運作,但由於 javac8 中的錯誤,它無法運作。但是,從 javac8 開始,如果註解類型中不存在參數名稱,編譯將繼續進行到 lombok 可以修復它的階段。
重申:此功能可能隨時消失;如果您使用此功能,請準備好在我們找到更好的方法來實作此功能時,或者在未來版本的 javac 強迫我們完全移除此功能且沒有替代方案時,調整您的程式碼。
onX
參數在任何類型寬變體上都不合法。例如,類別上的 @Getter
註解不支援 onMethod
。