前言
懒人是推动社会进步的原动力
很多技术都是为了偷懒而生的。。。
Lombok
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码,替换代码从而产生干净,简洁且易于维护的Java类
关于Lombok,一切以官网为准:Lombok官网
繁琐的实体类
编写pojo实体类都能感觉到有多么繁琐
简单的一个User实体类,只有3个属性id,name,password
public class User {
private int id;
private String name;
private String password;
至少需要无参构造、有参构造、setter、getter、toString
甚至涉及到比较还需要重写equals方法
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
Lombok使用
为懒人而生的Lombok,通过注解省去我们设置的上述方法
使用步骤:
- 安装插件
在IDEA里:File -》Settings -》Plugins -》搜索Lombok插件 -》install
- 导包
如果是Maven添加依赖, 不是Maven导包即可
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
注解
有哪些注解呢?
可以在插件界面看到,Lombok支持挺多注解
最常用也就这几个:
- @Data(实体类默认注解)
添加在类上
注解@Data后,自动完成了无参构造、getter、setter、equals、hashCode、toString
(太强了。。。)
- @AllArgsConstructor有参构造
添加在类上,从注解名也看得出是所有的参数的构造器
但是把无参构造去掉了,而且是所有的参数的构造器,不能选择
- @NoArgsConstructor
添加在类上,如果需要无参构造,可以加上这个注解
- @Getter、@Setter
可以添加在类上或者字段上
- 作用与方法、参数
NonNull设置在变量或者参数上,可以避免空指针
Synchronized可以替换synchronize关键字或lock锁
还有其他注解,大致都是这样,一切都是为了偷懒
Lombok实现原理
Lombok是在编译生成的字节码文件中会帮我们生成这些方法需要的方法
具体实现是:
-
javac对源代码进行分析,生成一棵抽象语法树(AST)
-
javac编译过程中调用实现了JSR 269的Lombok程序
-
此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树 (AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点
-
javac使用修改后的抽象语法树(AST)生成字节码文件
要不要使用Lombok?
利弊共存
Lombok既是一个IDE插件,也是一个项目要依赖的jar包
Lombok依赖jar包的原因是因为编译时要用它的注解
Lombok是插件的原因是他要在编译器编译时通过操作AST(抽象语法树)改变字节码生成(按照上面的原理)
所以Lombok可以改变java语法,是侵入式的工具
用时一时爽,报错火葬场
在知乎上看到的:
权衡利弊
很明显,Lombok有一定的优点:
- 简化繁琐的重复操作
- 简洁代码
也有缺点:
- 会改变Java语法,侵入式
- 和别人合作以前写代码就需要都安装Lombok,比较烦
- 代码对没接触过的太不友好了(没接触过Lombok看这代码根本看不懂)
总结,自己写代码,或者统一好了一起使用,用Lombok是真的方便
还有,Lombok应该就省略setter、getter等重复工作就好,别整花里胡哨的