Lombok 介绍
近来偶遇一款撸码神器,介绍给大家~ 相信许多小伙伴都深有体会,POJO 类中的千篇一律的 getter/setter,constructor 等方法让人写的揪心,那么今天就有一种方法可以残暴的解决这个问题。接下来为大家介绍这款神器:Lombok 以下是官方对 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.Project Lombok 是一个 java 库,它可以自动插入编辑器和构建工具,为 java 增色。永远不要再编写另一个 getter 或 equals 方法,使用一个注释,您的类就有了一个功能齐全的构建器、自动记录变量等等。
简而言之,Lombok 实现的效果就是通过简单的注解来精简代码达到消除冗长代码的目的。
Lombok 优点及缺点
对 Lombok 有了一个基本的认识之后,让我们来挖掘一下它的优缺点。首先看一下它的优点。
提高编码效率
使代码更简洁
消除冗长代码
避免修改字段名字时忘记修改方法名
提高下逼格
以上就是 Lombok 的优点,当然,Lombok 的优点远远不止以上几点,使用 Lombok,你可以更加优雅高效的编辑代码。但,俗话说“有利必有弊”,Lombok 为我们带来便利的同时也带来的不少小麻烦。
Lombok 需要额外的环境配置(接下来为讲到)
传染性(一旦在 resource 包里用了 lombok,别人想看源码也不得不装插件)
降低代码可读性
虽然 Lombok 有着不少缺点,但总归是利大于弊,作为一款优秀的神器,仍然值得我们去学习。
Lombok 原理
授人以鱼不如授人以渔,接下来简要介绍一下 Lombok 的原理。
Sun 公司在 2005.2.1 提交了 JSR 269,用于支持在编译期对 annotation 进行处理,即引入了插入式注解处理 API(Pluggable Annotation Processing API)。javac 从 java6 开始支持“JSR 269 API”规范,只要程序实现了该 API,就能在 javac 运行的时候得到调用,而 Lombok 实现了“JSR 269 API”,在编译时,javac 编译源码的具体流程如下:Source File -> Parse -> AST -> Annotation Processing -> Modified AST -> Analyze and Generate -> Byte Code
Lombok 引入项目
引入 Lombok jar 包
在项目中引入 Lombok 的方法有很多,在此以 Maven 为例进行讲解,其他途径可以参考官方网站 https://projectlombok.org/。打开 pom.xml 文件, 添加以下依赖。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
IDEA/Eclipse 安装 Lombok 插件
在上面提到,Lombok 需要额外的环境配置,此处以 IDEA 为例进行讲解。
第一步,打开 File -> Settings -> Plugins,输入 Lombok Plugin 点击搜索。
第二步,重启 IDE 使插件生效。
Lombok 实战 Coding
完成了上述准备之后,就可以愉快的使用 Lombok 进行编码了。编码之前首先为大家介绍一下 Lombok 的基本用法。
@Data 包含了 @Getter @Setter @ToString @EqualsAndHashCode 即自动为类生成所有 getter、setter、toString、eaquals 以及 hashCode 方法 @Getter 为所有属性生成 public 修饰的 get 方法 @Getter(AccessLevel.PROTECTED) 为所有属性生成 protected 修饰的 get 方法
@Setter 为所有属性生成 public 修饰的 set 方法 @Setter(AccessLevel.PROTECTED) 为所有属性生成 protected 修饰的 set 方法
@NoArgsConstructor 无参构造器 @AllArgsConstructor 生成带有所有属性的有参构造器
@ToString 默认生成带有所有属性的 toString 方法 @ToString(exclude = “column”) 生成除 column 属性之外的所有属性的 toString 方法 @ToString(exclude = {“column1”, “column2”}) @ToString(of = “column”) 生成只有 column 属性的 toString 方法 @ToString(of = {“column1”, “column2”})
@EqualsAndHashCode@EqualsAndHashCode(exclude = “column”) 以 column 属性之外的属性作为是否是相同对象判断的标准 @EqualsAndHashCode(of = “column”)) 只以 column 属性作为是否是相同对象判断的标准
@Slf4j 为当前类生成日志对象 @Log4j 为当前类生成日志对象
接下来让我们简单对比一下代码。首先是未经简化的代码。
public class User {
private Integer id;
private String username;
private String password;
private String email;
private String phone;
public User(Integer id, String username, String password, String email, String phone) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.phone = phone;
}
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(username, user.username) &&
Objects.equals(password, user.password) &&
Objects.equals(email, user.email) &&
Objects.equals(phone, user.phone);
}
@Override
public int hashCode() {
return Objects.hash(id, username, password, email, phone, question, answer, role, createTime, updateTime);
}
}
接下来是使用 Lombok 简化后的代码。
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
private String email;
private String phone;
}
Lombok 的更多用法,在此不再赘述,等待大家去慢慢发掘。
Lombok 工作中需要注意的点
Lombok 虽然好用,但推荐大家选择适合的地方使用 Lombok,例如 POJO 是一个好地方,因为 POJO 很单纯。
彩蛋
反编译大法
如果有小伙伴想要深究 Lombok 是如何实现插入式注解的,可以利用反编译大法查看源码。在此推荐另一款神兵利器 Java Decompiler。官方网站为:http://java-decompiler.github.io/ 有以下三种安装方式:
JD-GUI 图形化客户端
JD-Eclipse eclipse 插件
JD-IntelliJ idea 插件
安装完成后可以通过 Java Decompiler 验证 Class 文件。