文章目录
  1. 1. 功能
    1. 1.1. 数据类
    2. 1.2. 其它特性
  2. 2. 与Intellij IDEA集成
  3. 3. 风险

Lombok是一个比较早、小众但是功能强大的Java库,源码在github上。如果你厌恶写Java代码时不得不手写或用IDE生成大量无趣的样板代码,如getter、setter等,那就准备好拥抱lombok吧。

功能

数据类

Lombok通过注解来减少样板代码的使用。对于数据类来说,自己看官网的视频吧。三分钟太长不想看?那么也可以快速浏览一下这里的代码。神奇的事情是怎么做到的呢?奥秘就是在编译时插入代码。你甚至还可以创建自己的注解!参考这篇文章

其它特性

除了本职的数据类以外,lombok还提供了许多其它的特性,以帮助我们减少样板代码的使用。官网的说明非常详细,也都附带了代码,我就不做说明书的搬运工了。这里放一个例子:@Synchronized

与Intellij IDEA集成

动手时间。新建Maven工程,往pom.xml中增加dependency,最后的pom.xml看起来就像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.ggg.lombok</groupId>
<artifactId>helloLombok</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

在src/main/java中新增一个Person类:

1
2
3
4
public class Person {
private String name;
private int age;
}

Person类中右击,Go To,Test(或者Ctrl/Command+T)便可以在src/test/java中新增一个对应的测试:

1
2
3
4
5
6
7
8
9
10
import org.junit.Test;
import static org.junit.Assert.*;
public class PersonTest {
@Test
public void should_get_name_from_person() {
new Person("ggg", 18);
}
}

出现了一条红线,编译失败。回到Person类中,在Person类的定义上面加上@AllArgsConstructorimport lombok.AllArgsConstructor;,还是编译不过。现在到了应该加载IDEA插件的时候了。参考这里来安装lombok插件,别忘了重启Intellij IDEA。这回编译成功了。在测试的调用构造函数处Command/Ctrl+B便能跳转到Person类的@AllArgsConstructor上。接着写测试:

1
2
3
Person ggg = new Person("ggg", 18);
assertEquals("ggg", ggg.getName());

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的痛苦以及替代方案,值得看官们参考。

文章目录
  1. 1. 功能
    1. 1.1. 数据类
    2. 1.2. 其它特性
  2. 2. 与Intellij IDEA集成
  3. 3. 风险