先科普下Lombok,一个第三方的Java字节修改库,用来帮助你自动生成一些“冗余”代码的工具。(在此请允许我吐槽下这个官方网站浓浓的山寨VB程序页面)

Java,作为流行的编程语言。最受人诟病的一个缺点,就是“罗嗦”。相比动态语言,变量要先定义,类型要先定义,每个类要写很多的get/set/toString/hashCode等等方法。为了避免写这些“罗嗦”的方法,好多程序员一直在到处寻找一个能够使他们摆脱这些烦的事情的工具,比如今天我要谈论的这个Lombok,就被认为是一个处理这方面的好工具。

然而我却并不这么认为。

先来了解下Lombok的工作原理吧。由于Java的官方版本没有提供这种“便利”的工具。而类似Lombok的工具都是使用了从Java 6和JSR 269的Annotation Processing技术。

但是这个新特性的本意是只能用来根据Annotation生成新的代码(或者文档),而不是用来修改现有的代码的。Lombok是怎么做的呢?根据官方的文档

使用非公开的API,在知道在javac编译代码时,annotation processor的实例一定是JavacAnnotationProcessor(接口AnnotationProcessor的内部实现),直接使用强制类型转换cast。再从JavacAnnotationProcessor的方法里面拿到抽象语法树(AST)做修改。

接着看看大家认为的最大好处:

  • 省代码,省很多的代码

好吧,必须承认,代码变少了,看起来更清楚了。但是,但是你确定值得为了这个好处放弃很多其他的东西么?在现有的IDE能很快的帮你生成这些代码,能自动折叠这些代码的情况下。

你放弃的东西:

  • 代码和字节码的对应关系

你的程序的源代码一般只包含.java文件,除了发布的时候,不会有人把.class文件上传到代码控制库里面。这是因为你写的是源代码,字节码只是你写的代码编译的必然结果而已。然而,使用这种第三方的工具,其实破坏了编译的过程,增加了依赖,也就是Lombok这个工具。

你必须希望这个工具能工作在所有的jdk版本上,且没有bug;

你必须精心的安排编译过程,Lombok必须第一个处理你的代码,不然直接就是编译错误,因为这些生成的方法是编译期由Lombok产生的。

你必须告诉你的IDE在分析代码的时候做同样的事情。有人辩解说Eclipse也是利用类似的方式获取代码的抽象语法树。恩,true。但是eclipse的目的只是给出更好的代码提示和追踪功能而已,和你最后实际跑的代码一毛钱关系也没有。换个说法,如果eclipse告诉你,一旦你用eclipse编辑过的代码,以后所有编译都必须带上eclipse的SDK,你会怎么想?

  • 封装 encapsulation 封装

所有这些“冗余”的set/get方法,都是封装模式的一部分。复习下Java的基础知识,为什么要写get/set方法???如果只是简单的想把变量暴露出来,为什么不直接定义public???为什么要写set和get两个方法???

不要盲目的觉得写get/set是一项繁琐的,无意义的工作。先搞清楚get/set存在的意义。如果你认为get/set只是简单重复的return this.xxx;this.xxx=_xxx;,那么Lombok也许就是你的“好工具”。