引言
在 Java 开发中,我们经常会写大量重复的样板代码,比如 Getter、Setter、构造函数、toString、equals、hashCode 等。虽然这些代码对功能没有直接影响,但却极大降低了代码的可读性和开发效率。
为了解决这个痛点,Lombok 应运而生。
本文将全面介绍 Lombok 的核心功能、使用方法、注意事项,以及在实际项目中的最佳实践,帮助你轻松写出简洁、优雅的 Java 代码。
一、什么是 Lombok?
Lombok 是一个 Java 库,它通过注解的方式,在编译期自动生成样板代码,从而减少开发人员的重复劳动。
优点:
简化代码结构,提升可读性
降低出错率(手写 getter/setter 易出错)
兼容 Spring、JPA、MapStruct 等常见框架
二、如何引入 Lombok?
1. Maven 依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version> <!-- 建议使用最新稳定版本 -->
<scope>provided</scope>
</dependency>
注意:
scope
使用provided
是因为 Lombok 只在编译期生效,不参与运行时。
2. IDEA 插件支持
如果使用 IDEA,请确保安装并启用 Lombok 插件:
File -> Settings -> Plugins -> 搜索
Lombok
并安装File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors 勾选
Enable annotation processing
三、常用注解详解
1. @Getter / @Setter
为类字段自动生成 getter 和 setter 方法。
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String name;
private int age;
}
2. @ToString
自动生成 toString()
方法。
@ToString
public class User {
private String name;
private int age;
}
支持排除字段:
@ToString(exclude = "password")
public class User {
private String name;
private String password;
}
3. @EqualsAndHashCode
自动生成 equals()
和 hashCode()
方法。
@EqualsAndHashCode
public class User {
private String name;
private int age;
}
4. @NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor
生成构造函数:
@NoArgsConstructor
: 无参构造@AllArgsConstructor
: 所有字段的构造函数@RequiredArgsConstructor
: final 和@NonNull
字段的构造函数
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
}
5. @Data
是 @Getter
, @Setter
, @ToString
, @EqualsAndHashCode
, @RequiredArgsConstructor
的组合注解。
@Data
public class User {
private String name;
private int age;
}
6. @Builder
提供 Builder 模式的支持(类似链式调用)。
@Builder
public class User {
private String name;
private int age;
}
使用方式:
User user = User.builder()
.name("张三")
.age(25)
.build();
7. @Value(不可变类)
将类设为不可变对象,相当于:
@Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor
@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
@Value
public class Point {
int x;
int y;
}
8. @SneakyThrows
自动捕获检查型异常,不强制手动 try-catch。
@SneakyThrows
public void readFile() {
Files.readAllLines(Paths.get("xxx.txt")); // 不再需要捕获 IOException
}
9. @Cleanup
自动资源关闭,类似 try-with-resources。
@SneakyThrows
public void test() {
@Cleanup InputStream in = new FileInputStream("xxx.txt");
// 自动关闭 in
}
四、Lombok + SpringBoot 示例
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserDTO {
private String name;
private Integer age;
}
在 Controller 中直接使用:
@RestController
public class UserController {
@GetMapping("/user")
public UserDTO getUser() {
return UserDTO.builder()
.name("张三")
.age(20)
.build();
}
}
五、注意事项与坑点
IDE 需要支持注解处理器,否则 Lombok 不生效
Lombok 生成的是编译期代码,不在源码中直接体现,不利于调试
不适合做公开 SDK 或类库接口(暴露了自动生成代码,影响可维护性)
某些注解组合使用会冲突,如
@Data
和@Builder
可能需要加@NoArgsConstructor(force = true)
与 JPA 的
@Entity
一起使用时,推荐手动写构造函数,避免 Lombok 的构造与代理机制冲突
六、Lombok 与 Record(JDK 14+)对比
Java 14+ 引入了 record
类型,也可用于生成不可变数据类,但功能较 Lombok 更有限。
public record User(String name, int age) {}
Lombok 在兼容性、扩展性方面依然更强,适合更复杂的业务场景。
七、总结
一句话总结:用好 Lombok,让你从“代码搬运工”变成“架构小能手”。