有人中意简洁的代码,有人诟病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
Lombok项目是一个Java库,可自动插入你的编辑器以及构建工具,为你的Java增添趣味。再也不用写额外的getter或equals方法,通过一个注解,你的类就有一个功能齐全的构造器,自动记录变量,等等。
感受使用Lombok的快捷与简便,下面二者功能相同
// 常规代码
public class User {
private String username;
private String password;
private String email;
// 省略各种getter、setter
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
// 重写toString方法
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
// 重写equals和hashCode方法
@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(username, user.username) &&
Objects.equals(password, user.password) &&
Objects.equals(email, user.email);
}
@Override
public int hashCode() {
return Objects.hash(username, password, email);
}
}// 使用了Lombok
@Data
public class User {
private String username;
private String password;
private String email;
}这个注解包括了 Getter、Setter、RequiredArgsConstructor、ToString、EqualsAndHashCode(后面会解释)
Lombok使用到注解,那么我们就从注解开始入手,注解的解析分为:
我们知道,javac让我们写的代码 .java编译成 .class,配合 拔插式注解处理接口 其编译过程如下:
拔插式注解处理接口 的Lombok项目(lombok.jar)一句话就是:Lombok修改了抽象语法树(AST),导致javac生成增强功能的字节码,也就是新的类
Lombok集成到 javac中作为一个注解处理器来启动。在IDEA中用插件的形式来支持Lombok,所以要使用则要先安装插件,然后再启动注解处理器


使用的话当然要加依赖了,以maven项目为例:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>怎样使用?直接在类上,变量,方法上加注解,常见的注解如下:
注解 | 解释 |
|---|---|
@Gette、@Setter | 生成getter、setter方法 |
@ToString | 重写toString方法 |
@EqualsAndHashCode | 重写hashCode、equals方法 |
@NoArgsConstructor | 无参构造 |
@AllArgsConstructor | 全参构造 |
@RequiredArgsConstructor | 按照要求生成构造器(final、@NotNull修饰的变量) |
@Data | Getter、Setter、RequiredArgsConstructor、ToString、EqualsAndHashCode |
@Builder | 生成的对象可链式调用set |
@Slf4j(还有其它的log注解) | 不用再new一个log对象,可直接调用 log.info("日志") |
@NonNull | 非空检查,否则抛出空指针异常 |
@Cleanup | 修饰的变量会自动关闭资源,调用close方法 |