使用 Lombok 插件优雅 Java 代码

在 Java 开发中,经常会写一些 JavaBean 需要 getter、setter 方法。纵然像 Eclipse 等能自动的生成这些方法,但是每次修改属性名时都需要重新生成一遍。

然而使用 Lombok,我们只要在类上面加上 @Getter、@Setter 注解,就自动生成了这些方法,大大提高开发效率。

Lombok 的官方地址:https://projectlombok.org/

安装

1、maven 添加依赖:

1
2
3
4
5
6
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<version>1.16.18</version>
</dependency>

2、安装插件(Eclipse 为例):

在官网:https://www.projectlombok.org/,下载 Jar 包:lombok.jar

将其拷贝到 Eclipse 安装目录。打开 cmd,切换到 Eclipse 安装目录,执行:java -jar lombok.jar。Lombok 会自动扫描当前电脑的 Eclipse 环境,点击“Install/Update”即可完成安装。

其安装原理就是在 eclipse 的安装目录下的 eclipse.ini 文件中添加了一行配置,如我本机的是:

1
-javaagent:D:\eclipse-jee-mars-2-win32-x86_64\lombok.jar

使用

Lombok 主要是靠注解起作用的,在 Java 代码中加入一些注解,编译后,Lombok 会解析注解,并编译出已经生成好的字节码文件。

具体原理可以了解 Java 的“插入式注解处理 API”。

这里只介绍几个比较常用的注解:

@Getter

使用此注解会生成对应的 getter 方法。

源码:

1
2
3
4
5
@Getter
public class User {
private int id;
private String name;
}

编译后:

1
2
3
4
5
6
7
8
9
10
public class User {
private int id;
private String name;
public String getName() {
return this.name;
}
public int getId() {
return this.id;
}
}

@Setter

使用此注解会生成对应的 setter 方法。

源码:

1
2
3
4
5
@Setter
public class User {
private int id;
private String name;
}

编译后:

1
2
3
4
5
6
7
8
9
10
public class User {
private int id;
private String name;
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
}

@ToString

使用此注解会自动重写对应的 toStirng 方法。

源码:

1
2
3
4
5
@ToString
public class User {
private int id;
private String name;
}

编译后:

1
2
3
4
5
6
7
public class User {
private int id;
private String name;
public String toString() {
return "User(id=" + this.id + ", name=" + this.name + ")";
}
}

@Data

这个注解包含范围最广,它包含 getter、setter、NoArgsConstructor 注解,即当使用当前注解时,会自动生成包含的所有方法。

源码:

1
2
3
4
5
@Data
public class User {
private int id;
private String name;
}

编译后:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class User {
private int id;
private String name;
public String toString() {
return "User(id=" + getId() + ", name=" + getName() + ")";
}
public int hashCode() {
int PRIME = 59;
int result = 1;
result = result * 59 + getId();
Object $name = getName();
result = result * 59 + ($name == null ? 43 : $name.hashCode());
return result;
}
protected boolean canEqual(Object other) {
return other instanceof User;
}
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof User)) {
return false;
}
User other = (User) o;
if (!other.canEqual(this)) {
return false;
}
if (getId() != other.getId()) {
return false;
}
Object this$name = getName();
Object other$name = other.getName();
return this$name == null ? other$name == null : this$name.equals(other$name);
}
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public int getId() {
return this.id;
}
}

@Slf4j

在需要打印日志的类中使用,当项目中使用了 slf4j 打印日志框架时使用该注解,自动生成 log 成员变量。

源码:

1
2
3
4
@Slf4j
public class User {

}

编译后:

1
2
3
public class User {
private static final Logger log = LoggerFactory.getLogger(User.class);
}

@NonNull

对方法参数加此注解,会在方法内部判断是否为空。

源码:

1
2
3
4
5
6
public class User {

public void test(@NonNull String id) {
// do something;
}
}

编译后:

1
2
3
4
5
6
7
8
public class User {

public void test(@NonNull String id) {
if (id == null) {
throw new NullPointerException("id is marked @NonNull but is null");
}
}
}

遇到过的一个坑

Lombok 对第二个字母就是大写的属性生成 getter、setter 方法时貌似有问题:

如:

1
2
@Getter
private String xAxis;

编译后:

1
2
3
4
private String xAxis;
public String getXAxis() {
return this.xAxis;
}

这是错误的,按照 Eclipse 生成的标准,getter 方法名应该是:getxAxis而非:getXAxis

总结

使用 Lombok 需要每个开发的 IDE 都要安装 Lombok 插件,当然这只是一次性的。

Lombok 除了上面几种注解外还有其它的,可以访问官网了解更多。

而且需要注意的是开发一定要明白加了这个注解对应真正的是生成了什么代码,不要因为对工具掌握不好而产生其它问题。像我们项目要求大家只能使用 getter 和 setter 注解,从而避免其它问题。

参考文章

https://www.cnblogs.com/throwable/p/9139908.html

https://www.cnblogs.com/peida/archive/2013/04/26/3038503.html