Kotlin With Lombok Problems

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容