关于Lombok¶
约 660 个字 133 行代码 预计阅读时间 4 分钟
Lombok 是一个 Java 注解库,它通过在编译期自动生成样板代码,帮助开发者减少 getter、setter、构造方法、toString() 等重复代码的编写。使用 Lombok 时需要保证 IDE 正确安装插件并开启注解处理功能。
依赖引入¶
在 Maven 项目中,Lombok 通常使用 provided 作用域,表示只在编译期使用,不会被打包到最终的 JAR 中。下面的示例使用的是当前较新的稳定版本 1.18.36:
| XML | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
如果使用 Spring Boot,通常可以直接引入依赖而无需显式指定版本:
| XML | |
|---|---|
1 2 3 4 5 | |
常用注解¶
| 注解 | 作用 |
|---|---|
@Data | 组合注解,包含 @Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor |
@Getter / @Setter | 自动生成 getter / setter 方法 |
@NoArgsConstructor | 生成无参构造方法 |
@AllArgsConstructor | 生成全参构造方法 |
@RequiredArgsConstructor | 为 final 字段生成构造方法,常用于 Spring 依赖注入 |
@ToString | 生成 toString() 方法 |
@EqualsAndHashCode | 生成 equals() 和 hashCode() 方法 |
@Slf4j | 自动生成 SLF4J 日志对象 log |
@Log4j2 | 自动生成 Log4j2 日志对象 |
@Builder | 生成 Builder 模式代码 |
@Value | 生成不可变对象,字段默认为 final |
@NonNull | 标记字段或参数不能为 null |
@SneakyThrows | 将受检异常转换为非受检异常抛出 |
@Accessors(chain = true) | 开启链式 setter 调用 |
实体类简化示例¶
使用 @Data 可以大幅减少实体类中的样板代码:
| Java | |
|---|---|
1 2 3 4 5 6 7 8 | |
上面的代码编译后,会自动生成 getId()、setId(...)、getUsername()、setUsername(...)、getEmail()、setEmail(...)、toString()、equals()、hashCode() 以及一个包含 final 字段的构造方法(如果存在 final 字段)。
构造方法相关注解¶
无参与全参构造¶
| Java | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 | |
为 final 字段生成构造方法¶
在 Spring 项目中,常用 @RequiredArgsConstructor 替代 @Autowired 字段注入:
| Java | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
@RequiredArgsConstructor和@AllArgsConstructor的区别
@RequiredArgsConstructor会为所有被final或者@NonNull修饰的字段提供一个构造器,其他没有被修饰的则不会提供构造器,而@AllArgsConstructor不考虑是否有修饰都会为所有字段提供构造器。例如:
| Java | |
|---|---|
1 2 3 4 5 6 7 | |
生成的构造器如下:
| Java | |
|---|---|
1 2 3 4 | |
日志注解¶
使用 @Slf4j 后,可以直接在代码中使用 log 对象:
| Java | |
|---|---|
1 2 3 4 5 6 7 8 9 10 | |
Tip
使用 @Slf4j 时,项目中需要有 SLF4J 的实现依赖,例如 logback-classic 或 log4j-slf4j-impl。
构建器模式¶
使用 @Builder 可以快速生成 Builder 模式代码:
| Java | |
|---|---|
1 2 3 4 5 6 7 8 9 10 | |
使用方式如下:
| Java | |
|---|---|
1 2 3 4 5 | |
其他实用注解¶
@Value¶
用于创建不可变对象,所有字段默认是 final,并且只生成 getter,不生成 setter:
| Java | |
|---|---|
1 2 3 4 5 6 7 | |
@NonNull¶
标记字段或参数不能为 null,Lombok 会在对应的方法中加入非空校验,一旦传 null 直接抛 NullPointerException:
| Java | |
|---|---|
1 2 3 4 5 6 7 | |
@SneakyThrows¶
用于在不需要显式 try...catch 或 throws 的情况下抛出受检异常:
| Java | |
|---|---|
1 2 3 4 5 6 7 8 9 | |