lombok常用注解
Lombok 常用注解全解析:简化 Java 代码的利器
Lombok 是一款 Java 开发工具,通过注解自动生成模板代码(如 getter/setter、构造函数等),减少冗余代码,提高开发效率。本文将详细介绍 Lombok 的核心注解、使用场景及注意事项,帮助你快速掌握其用法。
Lombok 依赖配置
在 Maven 或 Gradle 项目中引入 Lombok 依赖,注意需配合 IDE 插件(如 IntelliJ IDEA 的 Lombok Plugin)使用,否则可能出现编译错误。
Maven 配置
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version> <!-- 推荐使用最新稳定版 -->
<scope>provided</scope> <!-- 编译时生效,不打包到运行环境 -->
</dependency>
Gradle 配置
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'
}
核心注解详解
简化 Getter/Setter:@Getter / @Setter
- 作用:自动生成成员变量的
getXxx()和setXxx()方法。 - 使用场景:POJO 类、DTO 类等需要频繁定义 getter/setter 的场景。
import lombok.Getter;
import lombok.Setter;
// 为所有成员变量生成 getter
// 为所有成员变量生成 setter
public class User {
private Long id;
private String name;
// 仅为 age 生成 getter(覆盖类级别注解)
private Integer age;
}
- 高级属性:
value:指定访问权限(如@Getter(value = AccessLevel.PRIVATE)生成私有 getter)。
简化 toString:@ToString
- 作用:自动生成
toString()方法,默认包含所有非静态成员变量。 - 使用场景:需要打印对象信息(如日志输出、调试)时。
import lombok.ToString;
public class User {
private Long id;
private String name;
private Integer age;
}
// 生成的 toString() 类似:User(name=张三, age=20)
简化 equals/hashCode:@EqualsAndHashCode
- 作用:自动生成
equals()和hashCode()方法,基于非静态成员变量计算。 - 注意:若类继承自父类,需添加
callSuper = true以包含父类字段(默认 false)。
import lombok.EqualsAndHashCode;
public class User extends BaseEntity { // 假设 BaseEntity 有 id 字段
private String name;
private Integer age;
}
// 生成的 equals() 会比较父类的 id 和当前类的 name
构造函数简化:@NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor
- 作用:自动生成构造函数,减少手动编写的繁琐。
| 注解 | 功能描述 |
|---|---|
@NoArgsConstructor |
生成无参构造函数(若有 final 字段且未初始化,需配合 force = true 使用)。 |
@AllArgsConstructor |
生成包含所有成员变量的全参构造函数。 |
@RequiredArgsConstructor |
生成包含 final 字段 和 @NonNull 字段 的构造函数。 |
import lombok.*;
// force 强制为 final 字段生成默认值(0、null 等)
public class User {
private final Long id; // final 字段,@RequiredArgsConstructor 会包含它
private String name; // @NonNull 字段,@RequiredArgsConstructor 会包含它
private Integer age;
}
// @RequiredArgsConstructor 生成:public User(Long id, String name) { ... }
一站式简化:@Data
- 作用:组合注解,等价于
@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor。 - 适用场景:普通 POJO 类(如实体类、DTO),快速减少模板代码。
import lombok.Data;
public class User {
private Long id;
private String name;
private Integer age;
}
// 自动包含 getter/setter、toString、equals、hashCode 和包含 final/@NonNull 字段的构造函数
建造者模式:@Builder
- 作用:为类生成建造者模式 API,支持链式调用创建对象。
- 适用场景:成员变量较多时,替代多参构造函数,提高代码可读性。
import lombok.Builder;
import lombok.ToString;
public class User {
private Long id;
private String name;
private Integer age;
}
// 使用示例
User user = User.builder()
.id(1L)
.name("张三")
.age(20)
.build();
日志简化:@Slf4j / @Log4j2 等
- 作用:自动生成日志对象(如
log),无需手动声明private static final Logger log = ...。 - 常用注解:
@Slf4j:对应 SLF4J + Logback(推荐);@Log4j2:对应 Log4j2;@CommonsLog:对应 Apache Commons Logging。
import lombok.extern.slf4j.Slf4j;
// 生成:private static final org.slf4j.Logger log = ...;
public class UserService {
public void saveUser(User user) {
log.info("保存用户:{}", user); // 直接使用 log 对象
// 业务逻辑...
}
}
空指针检查:@NonNull
- 作用:标记字段或参数不能为空,自动生成空指针校验代码。
- 使用场景:避免方法调用时传入 null 导致的潜在异常。
import lombok.NonNull;
public class User {
private String name;
public void setName( String name) {
this.name = name;
// 自动生成校验:if (name == null) throw new NullPointerException("name is marked non-null but is null");
}
}
资源自动关闭:@Cleanup
- 作用:自动关闭实现
Closeable接口的资源(如 IO 流),替代try-finally。
import lombok.Cleanup;
import java.io.FileInputStream;
public class FileUtil {
public void readFile() throws Exception {
FileInputStream fis = new FileInputStream("test.txt"); // 自动关闭
// 读取文件操作...
}
// 等价于 try (FileInputStream fis = ...) { ... }(try-with-resources)
}
异常处理:@SneakyThrows
- 作用:偷偷捕获受检异常并抛出,无需在方法上声明
throws。 - 注意:不建议滥用,可能隐藏异常信息导致调试困难。
import lombok.SneakyThrows;
public class Demo {
// 捕获 InterruptedException
public void sleep() {
Thread.sleep(1000); // 无需声明 throws
}
}
同步方法:@Synchronized
- 作用:为方法添加同步锁,替代
synchronized关键字,更安全(使用私有锁对象)。
import lombok.Synchronized;
public class Counter {
private int count = 0;
// 等价于 synchronized (lock) { ... },lock 是私有对象
public void increment() {
count++;
}
}
使用 Lombok 的注意事项
- IDE 支持:必须安装 Lombok 插件(如 IntelliJ IDEA 需在插件市场搜索 “Lombok” 并启用),否则 IDE 会提示 “找不到方法”。
- 调试问题:生成的代码在编译后存在,但源码中不可见,调试时需查看反编译类(可通过 IDE 插件支持)。
- 继承问题:
@Data和@EqualsAndHashCode默认不包含父类字段,若需要需添加callSuper = true。 - 兼容性:部分框架(如 MyBatis、Jackson)依赖反射获取 getter/setter,Lombok 生成的方法完全兼容,可正常使用。
- 谨慎滥用:
@Data虽便捷,但在包含大量字段的类中可能生成冗余的equals()和hashCode(),建议按需拆分注解。