Kotlin With Lombok Problems

2017-12-21  本文已影响0人  hcjcch

Question

在使用Kotlin之前,我们曾经大量使用Lombok用来减少模版代码的编写,在Kotlin成名之后,我们迫不及待的切换到Kotlin下开发,但是Lombok却带来了不太友好的历史问题。

图1.png
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调用

fun main(args: Array<String>) {
    val b: AppUserJava = AppUserJava("liying", 24)
    println(b.age)
}

一看没有问题啊,有了@Getter标签,Lombok会帮我们生成所有Field的getter,然后Kotlin调用,思路没有任何问题,但是却报了图中的编译错误,为什么呢?
打印出一个正确的编译流程:

图2.png
图中的2个箭头反应了错误的发生原因,因为是先编译的kotlin,然后才编译Java,在编译Kotlin的时候,Java代码根本还没有编译,因此Lombok也没有自动生成代码,所以编译Kotlin就失败了
图3.png
如图:执行task compileKotlin失败了。

解决方案

1.再来一张图

图4
图中有4个箭头顺序依次是:library:compileKotlin,:library:compileJava,:app:compileKotlin,:app:compileJava。所以发现编译流程有这样一个规律,先编译library层的代码,再编译app层的代码,也就是library层的所有代码(Kotlin和Java)都编译完了(Lombok生成代码也执行了)才会编译app层代码。所以是不是我们把Lombok修饰的代码放到library层就ok了,事实确实是如此。但是这种解决方案不够优雅,有一些弊端,尤其是那些之前没有分层的代码很糟糕,但确实能解决我们的问题。
2.是否可以改变编译顺序呢,先编译Java后编译Kotlin?这只是一个猜测,还没有实践,看到本文有实践过的朋友欢迎留个言。

参考:
1.https://stackoverflow.com/questions/35517325/kotlin-doesnt-see-java-lombok-accessors/35530223#35530223
2https://github.com/rzwitserloot/lombok/issues/1169

上一篇下一篇

猜你喜欢

热点阅读