Question
在使用Kotlin之前罩润,我們曾經(jīng)大量使用Lombok用來減少模版代碼的編寫翼馆,在Kotlin成名之后金度,我們迫不及待的切換到Kotlin下開發(fā),但是Lombok卻帶來了不太友好的歷史問題猜极。
AppUserJava.java
@Getter
public class AppUserJava {
private String name;
private int age;
public AppUserJava(String name, int age) {
this.name = name;
this.age = age;
}
}
Kotlin調(diào)用
fun main(args: Array<String>) {
val b: AppUserJava = AppUserJava("liying", 24)
println(b.age)
}
一看沒有問題啊跟伏,有了@Getter
標(biāo)簽,Lombok會幫我們生成所有Field的getter受扳,然后Kotlin調(diào)用,思路沒有任何問題峡蟋,但是卻報了圖中的編譯錯誤华望,為什么呢蕊蝗?
打印出一個正確的編譯流程:
圖中的2個箭頭反應(yīng)了錯誤的發(fā)生原因蓬戚,因為是先編譯的kotlin,然后才編譯Java宾抓,在編譯Kotlin的時候,Java代碼根本還沒有編譯洞慎,因此Lombok也沒有自動生成代碼,所以編譯Kotlin就失敗了
如圖:執(zhí)行task compileKotlin失敗了旭绒。
解決方案
1.再來一張圖
圖中有4個箭頭順序依次是
:library:compileKotlin
,:library:compileJava
,:app:compileKotlin
,:app:compileJava
焦人。所以發(fā)現(xiàn)編譯流程有這樣一個規(guī)律,先編譯library層的代碼忽匈,再編譯app層的代碼矿辽,也就是library層的所有代碼(Kotlin和Java)都編譯完了(Lombok生成代碼也執(zhí)行了)才會編譯app層代碼郭厌。所以是不是我們把Lombok修飾的代碼放到library層就ok了雕蔽,事實確實是如此。但是這種解決方案不夠優(yōu)雅批狐,有一些弊端,尤其是那些之前沒有分層的代碼很糟糕嚣艇,但確實能解決我們的問題。2.是否可以改變編譯順序呢困乒,先編譯Java后編譯Kotlin贰谣?這只是一個猜測,還沒有實踐冈爹,看到本文有實踐過的朋友歡迎留個言欧引。
參考:
1.https://stackoverflow.com/questions/35517325/kotlin-doesnt-see-java-lombok-accessors/35530223#35530223
2https://github.com/rzwitserloot/lombok/issues/1169