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 后,代码量显著减少,只保留了字段的定义,核心结构一目了然。