Project Lombok 是一个 Java 库,它通过注解的方式,在编译期自动生成 Java 类的样板代码(boilerplate code),从而极大地简化了 Java 类的编写,提高了开发效率和代码的可读性。
介绍
在传统的 Java 开发中,我们经常需要为类编写大量的重复性代码,比如:
- 类的属性(字段)的
getter 和 setter 方法。
- 各种类型的构造方法(无参构造、全参构造等)。
- 用于对象比较和集合操作的
equals() 和 hashCode() 方法。
- 用于打印对象信息的
toString() 方法。
这些代码逻辑简单但又必不可少,它们占据了大量的代码行,使得核心业务逻辑不够突出,降低了代码的可读性和维护性。每当添加或修改字段时,都需要手动更新这些方法,容易出错。
Lombok 如何工作?
Lombok 通过充当一个注解处理器来工作。当你将 Lombok 作为依赖添加到项目中,并在类上使用其提供的注解时,Lombok 会在 Java 编译器编译你的源代码时介入。它读取 Lombok 注解,然后根据注解的指示,在编译后的 .class 文件中自动生成相应的代码(如 getter, setter, 构造方法等)。
这意味着你的 .java 源文件看起来非常简洁,只包含字段和少量的 Lombok 注解,但编译后生成的 .class 文件是完整的,包含了所有必要的方法。
主要特性和常用注解:
Lombok 提供了许多实用的注解来生成不同类型的代码:
@Getter / @Setter: 在字段或类上使用,自动生成字段的 getter / setter 方法
@Data 注解在类,生成 setter/getter、equals、canEqual、hashCode、toString 方法,如为 final 属性,则不会为该属性生成 setter 方法
@NoArgsConstructor: 生成一个无参构造方法
@AllArgsConstructor: 生成一个包含所有字段的构造方法
@RequiredArgsConstructor: 生成一个包含所有 final 字段和带有 @NonNull 注解的字段的构造方法
@ToString: 生成一个 toString() 方法,方便打印对象信息
@EqualsAndHashCode: 生成 equals() 和 hashCode() 方法,用于对象的比较
@Data: 这是一个非常常用的复合注解,相当于 @Getter, @Setter, @RequiredArgsConstructor, @ToString, 和 @EqualsAndHashCode 的组合。通常用在简单的 POJO 类上
@Builder: 生成实现 Builder 设计模式所需的所有代码,使得对象创建更加灵活和可读
@Cleanup: 确保流(Stream)等资源在使用完毕后自动关闭
@Slf4j, @CommonsLog, @Log4j2 等: 为类生成不同日志框架的 Logger 对象字段
- 严格意义来说是常量
private static final Logger log = LoggerFactory.getLogger(UserController.class);
优点
- 减少样板代码: 代码更简洁,更易读。
- 提高开发效率: 无需手动编写或更新大量重复方法。
- 易于维护: 字段增删改时,Lombok 自动处理相关方法的更新。
其他:生成的方法在源代码中不可见,这可能使得初学者在调试时需要适应一下。但在 IDE 插件的支持下,通常可以“跳转到定义”来查看 Lombok 生成的方法签名。
开发工具插件
使用示例
以 @Data 为例,不使用 Lombok:
public class User {
private Long id;
private String name;
private int age;
public User() {
}
public User(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
// 省略 equals() 和 hashCode() 方法
}
使用 Lombok (@Data):
import lombok.Data; // 需要导入相应的Lombok注解
@Data // 这一个注解代替了上面大部分的样板代码
public class User {
private Long id;
private String name;
private int age;
}
可以看到,使用了 Lombok 后,代码量显著减少,只保留了字段的定义,核心结构一目了然。