一、Lombok 简介
Lombok 是一个 Java 库,通过注解自动生成常见代码(getter/setter、构造方法、equals/hashCode 等),减少样板代码。
安装:
IDE 需安装 Lombok 插件
Maven 依赖:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency>二、常用注解详解
1. @Getter / @Setter
生成字段的 getter/setter 方法。
@Getter @Setter private String name; // 或加在类上,为所有字段生成 @Getter @Setter public class User { private String name; private int age; private boolean active; // boolean 的 getter 是 isActive() }2. @ToString
生成 toString 方法。
@ToString @ToString.Exclude // 排除字段 @ToString(onlyExplicitlyIncluded = true) // 只包含 @ToString.Include public class User { private String name; @ToString.Exclude private String password; }3. @EqualsAndHashCode
生成 equals 和 hashCode 方法。
@EqualsAndHashCode @EqualsAndHashCode.Exclude @EqualsAndHashCode(of = {"id", "name"}) // 指定字段 public class User { private Long id; private String name; @EqualsAndHashCode.Exclude private String password; }4. @NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor
@NoArgsConstructor // 无参构造 @AllArgsConstructor // 全参构造 @RequiredArgsConstructor // 必需参数构造(final 或 @NonNull 字段) public class User { private final Long id; // RequiredArgsConstructor 会包含 @NonNull private String name; // RequiredArgsConstructor 会包含 private int age; }5. @Data
组合注解:@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
@Data public class User { private Long id; private String name; private int age; }6. @Builder
生成建造者模式代码。
@Builder public class User { private Long id; private String name; private int age; } // 使用 User user = User.builder() .id(1L) .name("张三") .age(25) .build();@Builder 的高级用法:
@Builder(toBuilder = true) // 允许从实例构建新对象 public class User { // ... } // 复制并修改 User newUser = user.toBuilder().age(26).build();7. @Slf4j
自动生成 SLF4J 日志对象。
@Slf4j public class UserService { public void doSomething() { log.info("执行操作"); log.error("发生错误"); } }其他日志注解:@Log(java.util.logging)、@Log4j2 等。
8. @NonNull
自动生成空值检查。
public class User { public void setName(@NonNull String name) { // lombok 会自动生成 if (name == null) throw new NullPointerException this.name = name; } }9. @Cleanup
自动关闭资源。
public void readFile() throws IOException { @Cleanup InputStream in = new FileInputStream("test.txt"); // 自动生成 try-finally 调用 in.close() }10. @SneakyThrows
偷偷抛出受检异常,无需显式声明。
@SneakyThrows public void readFile() { // 无需 throws IOException Files.readAllBytes(Paths.get("test.txt")); }三、注解搭配使用示例
@Data @Builder(toBuilder = true) @AllArgsConstructor @NoArgsConstructor public class User { private Long id; private String name; private int age; @ToString.Exclude private String password; } // 使用 User user = User.builder() .id(1L) .name("李四") .age(30) .password("123456") .build(); User copy = user.toBuilder().age(31).build();四、配置(lombok.config)
创建lombok.config文件在项目根目录:
# 要求所有 @Data 类都生成全参构造 lombok.data.allArgsConstructor = true # 禁止使用某些注解 lombok.nonNull.exceptionType = NullPointerException五、注意事项
@Builder @NoArgsConstructor @AllArgsConstructor public class User {} // 同时添加两个构造器注解与 JPA/Hibernate 搭配:@Data 生成的 equals/hashCode 可能导致懒加载问题,建议手动控制
构造器冲突:@Builder 和 @AllArgsConstructor 同时使用时,注意构造器顺序
IDE 支持:必须安装插件,否则会显示编译错误
版本兼容:注意与 Java 版本的兼容性
六、常见问题
Q1:@Builder 无法使用无参构造?
@Builder @NoArgsConstructor @AllArgsConstructor public class User {} // 同时添加两个构造器注解Q2:@Slf4j 日志对象叫什么?
默认是log,可通过@Slf4j(topic = "loggerName")修改。
Q3:如何让 @Data 不生成 setter?
使用@Getter @Setter @ToString @EqualsAndHashCode分别控制。
总结
| 注解 | 用途 |
|---|---|
| @Getter/@Setter | 生成 getter/setter |
| @ToString | 生成 toString |
| @EqualsAndHashCode | 生成 equals/hashCode |
| @NoArgsConstructor | 无参构造 |
| @AllArgsConstructor | 全参构造 |
| @Data | 综合注解 |
| @Builder | 建造者模式 |
| @Slf4j | 日志对象 |
| @NonNull | 非空校验 |
| @Cleanup | 自动资源管理 |
| @SneakyThrows | 简化异常处理 |
建议日常开发中使用 @Data + @Builder + @Slf4j 组合,可大幅减少样板代码。