用Lombok优雅地写代码
Lombok是一个比较早、小众但是功能强大的Java库,源码在github上。如果你厌恶写Java代码时不得不手写或用IDE生成大量无趣的样板代码,如getter、setter等,那就准备好拥抱lombok吧。
功能
数据类
Lombok通过注解来减少样板代码的使用。对于数据类来说,自己看官网的视频吧。三分钟太长不想看?那么也可以快速浏览一下这里的代码。神奇的事情是怎么做到的呢?奥秘就是在编译时插入代码。你甚至还可以创建自己的注解!参考这篇文章
其它特性
除了本职的数据类以外,lombok还提供了许多其它的特性,以帮助我们减少样板代码的使用。官网的说明非常详细,也都附带了代码,我就不做说明书的搬运工了。这里放一个例子:@Synchronized。
与Intellij IDEA集成
动手时间。新建Maven工程,往pom.xml中增加dependency,最后的pom.xml看起来就像这样:
在src/main/java中新增一个Person类:
Person类中右击,Go To,Test(或者Ctrl/Command+T)便可以在src/test/java中新增一个对应的测试:
出现了一条红线,编译失败。回到Person类中,在Person类的定义上面加上@AllArgsConstructor
并import lombok.AllArgsConstructor;
,还是编译不过。现在到了应该加载IDEA插件的时候了。参考这里来安装lombok插件,别忘了重启Intellij IDEA。这回编译成功了。在测试的调用构造函数处Command/Ctrl+B便能跳转到Person类的@AllArgsConstructor
上。接着写测试:
getName又红了。切换回Person类,再加上@Getter
,编译通过!运行测试,绿了!
还可以通过Find Usages来找到字段的get方法在哪调用,可惜不能找到构造函数在哪调用。在享用便捷的同时,也需要付出些许的代价。有兴趣的看官可以自行尝试文档中的其它注解。例如@ToString(of="name")
,@Log
,@Getter(lazy=true)
等等。值得一提的是,@Cleanup可以轻松地关闭流、连接等对象,Java 7也提供了try-with-resources来做到这一点,只不过需要缩进罢了,但是可以很明显地看出作用域。还请自行选择喜欢的那个。当然,如果你的项目还在用老旧的Java 6,那确实也没有什么选择的余地。
风险
首先,Lombok扮演着一个注解处理器的角色,在编译时通过修改抽象语法树(Abstract Syntax Tree,AST)来修改代码。但是这是被注解处理器规范所明令禁止的,规范仅允许生成新文件或是新类。而聪明的lombok开发者通过javac未公开的API绕开了这个限制。所以有人视lombok为邪门歪道。不过嘛,不管黑猫白猫,能捉老鼠的就是好猫;不管黑糖白糖,能少写代码的就是好糖。先了解它,再决定要不要因为代价而放弃收益。如果未来的Java版本取消了后门,那么使用lombok的项目就存在升级JDK的风险。如果介意这一点,并且只有数据类的需求,可以去看看google的AutoValue。不过白魔法比黑魔法总是缺了点什么…
第二点是IDE的支持。虽然是支持,但是你也看到了并不能像原来虽然写了代码,但大都是自动生成的代码那样随心所欲地各种重构。另外IDE偶尔抽点风也可能会让你流半天汗。
第三点是代码覆盖率的测试。如果贵公司对它有明确而严格的要求,那就需要好好研究lombok与所用的代码覆盖率工具的兼容程度了。目前看来lombok与Cobertura的兼容性还是最好的。
最后一点是代码行为可能会与你的预期不一样,比如enum的@ToString
。这篇文章中详细地介绍了非预期的代码行为、去lombok的痛苦以及替代方案,值得看官们参考。