美文网首页
Kotlin With Lombok Problems

Kotlin With Lombok Problems

作者: hcjcch | 来源:发表于2017-12-21 23:49 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Kotlin With Lombok Problems

          本文链接:https://www.haomeiwen.com/subject/nhbzwxtx.html