Lombok 常用注解全解析:简化 Java 代码的利器
Lombok 是一款 Java 开发工具,通过注解自动生成模板代码(如 getter/setter、构造函数等),减少冗余代码,提高开发效率。本文将详细介绍 Lombok 的核心注解、使用场景及注意事项,帮助你快速掌握其用法。
Lombok 依赖配置
在 Maven 或 Gradle 项目中引入 Lombok 依赖,注意需配合 IDE 插件(如 IntelliJ IDEA 的 Lombok Plugin)使用,否则可能出现编译错误。
Maven 配置
1 2 3 4 5 6
| <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency>
|
Gradle 配置
1 2 3 4
| 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 的场景。
1 2 3 4 5 6 7 8 9 10 11 12 13
| import lombok.Getter; import lombok.Setter;
@Getter @Setter public class User { private Long id; private String name;
@Getter private Integer age; }
|
- 高级属性:
value:指定访问权限(如 @Getter(value = AccessLevel.PRIVATE) 生成私有 getter)。
简化 toString:@ToString
- 作用:自动生成
toString() 方法,默认包含所有非静态成员变量。
- 使用场景:需要打印对象信息(如日志输出、调试)时。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import lombok.ToString;
@ToString( includeFieldNames = true, // 显示字段名(默认 true) of = {"name", "age"}, // 仅包含指定字段 exclude = "id" // 排除指定字段 ) public class User { private Long id; private String name; private Integer age; }
|
简化 equals/hashCode:@EqualsAndHashCode
- 作用:自动生成
equals() 和 hashCode() 方法,基于非静态成员变量计算。
- 注意:若类继承自父类,需添加
callSuper = true 以包含父类字段(默认 false)。
1 2 3 4 5 6 7 8
| import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true, of = {"name"}) public class User extends BaseEntity { private String name; private Integer age; }
|
构造函数简化:@NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor
| 注解 |
功能描述 |
@NoArgsConstructor |
生成无参构造函数(若有 final 字段且未初始化,需配合 force = true 使用)。 |
@AllArgsConstructor |
生成包含所有成员变量的全参构造函数。 |
@RequiredArgsConstructor |
生成包含 final 字段 和 @NonNull 字段 的构造函数。 |
1 2 3 4 5 6 7 8 9 10 11
| import lombok.*;
@RequiredArgsConstructor @NoArgsConstructor(force = true) public class User { private final Long id; @NonNull private String name; private Integer age; }
|
一站式简化:@Data
- 作用:组合注解,等价于
@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor。
- 适用场景:普通 POJO 类(如实体类、DTO),快速减少模板代码。
1 2 3 4 5 6 7 8 9
| import lombok.Data;
@Data public class User { private Long id; private String name; private Integer age; }
|
建造者模式:@Builder
- 作用:为类生成建造者模式 API,支持链式调用创建对象。
- 适用场景:成员变量较多时,替代多参构造函数,提高代码可读性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import lombok.Builder; import lombok.ToString;
@Builder @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。
1 2 3 4 5 6 7 8 9
| import lombok.extern.slf4j.Slf4j;
@Slf4j public class UserService { public void saveUser(User user) { log.info("保存用户:{}", user); } }
|
空指针检查:@NonNull
- 作用:标记字段或参数不能为空,自动生成空指针校验代码。
- 使用场景:避免方法调用时传入 null 导致的潜在异常。
1 2 3 4 5 6 7 8 9 10
| import lombok.NonNull;
public class User { private String name;
public void setName(@NonNull String name) { this.name = name; } }
|
资源自动关闭:@Cleanup
- 作用:自动关闭实现
Closeable 接口的资源(如 IO 流),替代 try-finally。
1 2 3 4 5 6 7 8 9 10
| import lombok.Cleanup; import java.io.FileInputStream;
public class FileUtil { public void readFile() throws Exception { @Cleanup FileInputStream fis = new FileInputStream("test.txt"); } }
|
异常处理:@SneakyThrows
- 作用:偷偷捕获受检异常并抛出,无需在方法上声明
throws。
- 注意:不建议滥用,可能隐藏异常信息导致调试困难。
1 2 3 4 5 6 7 8
| import lombok.SneakyThrows;
public class Demo { @SneakyThrows(InterruptedException.class) public void sleep() { Thread.sleep(1000); } }
|
同步方法:@Synchronized
- 作用:为方法添加同步锁,替代
synchronized 关键字,更安全(使用私有锁对象)。
1 2 3 4 5 6 7 8 9 10
| import lombok.Synchronized;
public class Counter { private int count = 0;
@Synchronized public void increment() { count++; } }
|
使用 Lombok 的注意事项
- IDE 支持:必须安装 Lombok 插件(如 IntelliJ IDEA 需在插件市场搜索 “Lombok” 并启用),否则 IDE 会提示 “找不到方法”。
- 调试问题:生成的代码在编译后存在,但源码中不可见,调试时需查看反编译类(可通过 IDE 插件支持)。
- 继承问题:
@Data 和 @EqualsAndHashCode 默认不包含父类字段,若需要需添加 callSuper = true。
- 兼容性:部分框架(如 MyBatis、Jackson)依赖反射获取 getter/setter,Lombok 生成的方法完全兼容,可正常使用。
- 谨慎滥用:
@Data 虽便捷,但在包含大量字段的类中可能生成冗余的 equals() 和 hashCode(),建议按需拆分注解。
v1.3.10