Lombok 的核心思想是:通过注解来消除 Java 中的冗长代码,让代码更加简洁、清晰和易于维护。
它通过在编译时自动生成这些代码的字节码(比如 getter、setter、构造函数等),让你在源代码中无需手动编写它们。
它解决了什么问题?
在标准的 Java 开发中,我们经常需要为类的属性编写大量重复、模板化的代码,例如:
- Getter 和 Setter 方法 :为每个私有字段生成
getXxx()
和setXxx()
方法。 - 构造函数:无参构造、全参构造等。
equals()
、hashCode()
和toString()
方法。- 日志记录器 :每次都要声明
private static final Logger log = ...
。
这些代码本身没有业务逻辑,但又必须存在,导致:
- 源代码冗长:一个简单的 POJO 类可能就有上百行代码。
- 不易维护 :如果增加或修改一个字段,你需要手动修改对应的 getter、setter、
equals
、hashCode
、toString
等方法,很容易出错。
Lombok 是如何工作的?
Lombok 是一个 Java 编译时注解处理器。它的工作流程如下:
- 你编写代码 :在 Java 类上使用 Lombok 注解(如
@Data
)。 - 编译器调用 Lombok :当你使用
javac
(或 IDE 内置的编译功能)编译代码时,编译器会检测到 Lombok 注解。 - Lombok 修改 AST :Lombok 会介入编译过程,修改 Java 编译器的抽象语法树(AST) ,将注解对应的代码(如 getter 方法)的字节码"注入"到正在编译的类中。
- 生成最终的
.class
文件 :最终生成的.class
文件就包含了这些自动生成的方法,就好像是你自己亲手写的一样。
关键点 :Lombok 修改的是 .class
文件,而不是你的 .java
源文件。所以你的源代码看起来非常干净,但编译后的类却拥有所有完整的方法。
常用注解示例
让我们通过一个例子来直观感受 Lombok 的强大。
没有 Lombok 的代码:
java
public class User {
private Long id;
private String name;
private Integer age;
public User() {
}
public User(Long id, String name, Integer 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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
// ... 冗长且容易出错的 equals 实现 ...
}
@Override
public int hashCode() {
// ... 冗长且容易出错的 hashCode 实现 ...
}
@Override
public String toString() {
// ... toString 实现 ...
}
}
使用 Lombok 后的代码:
java
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data // 生成所有字段的getter、setter、equals、hashCode、toString方法
@NoArgsConstructor // 生成无参构造函数
@AllArgsConstructor // 生成全参构造函数
public class User {
private Long id;
private String name;
private Integer age;
}
看到了吗?只需要 4 行注解,就替代了上面近 60 行的代码! 代码变得极其简洁,可读性大大增强。
常用 Lombok 注解列表
注解 | 作用 |
---|---|
@Getter / @Setter |
为所有字段或特定字段生成 getter/setter。 |
@ToString |
生成 toString() 方法。 |
@EqualsAndHashCode |
生成 equals() 和 hashCode() 方法。 |
@NoArgsConstructor |
生成无参构造函数。 |
@AllArgsConstructor |
生成全参构造函数。 |
@RequiredArgsConstructor |
为 final 字段和标记了 @NonNull 的字段生成构造函数。 |
@Data |
最常用 ,是 @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 的合集。 |
@Builder |
提供一种优雅的建造者模式来创建对象。 |
@Slf4j |
自动注入一个日志记录器 log (也可以是 @Log4j , @Log 等)。 |
@val |
用于声明局部变量,类型会自动推断(类似于 final var )。 |
@NonNull |
标注在参数或字段上,自动生成空值检查。 |
如何使用 Lombok?
-
添加依赖:在项目的构建工具中加入 Lombok 依赖。
- Maven:
xml
java<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <!-- 使用最新版本 --> <scope>provided</scope> </dependency>
- Gradle:
gradle
javacompileOnly 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok:1.18.30'
- 安装 IDE 插件:由于 Lombok 在编译时修改字节码,你的 IDE(如 IntelliJ IDEA, Eclipse)需要安装对应的 Lombok 插件,才能正确识别和提示这些自动生成的方法。现在 IntelliJ IDEA 通常已内置支持。