0%

lombok常用注解

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 // 为所有成员变量生成 getter
@Setter // 为所有成员变量生成 setter
public class User {
private Long id;
private String name;

// 仅为 age 生成 getter(覆盖类级别注解)
@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;
}

// 生成的 toString() 类似:User(name=张三, age=20)

简化 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 { // 假设 BaseEntity 有 id 字段
private String name;
private Integer age;
}
// 生成的 equals() 会比较父类的 id 和当前类的 name

构造函数简化:@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) // force 强制为 final 字段生成默认值(0、null 等)
public class User {
private final Long id; // final 字段,@RequiredArgsConstructor 会包含它
@NonNull private String name; // @NonNull 字段,@RequiredArgsConstructor 会包含它
private Integer age;
}

// @RequiredArgsConstructor 生成:public User(Long id, String name) { ... }

一站式简化:@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;
}
// 自动包含 getter/setter、toString、equals、hashCode 和包含 final/@NonNull 字段的构造函数

建造者模式:@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 // 生成:private static final org.slf4j.Logger log = ...;
public class UserService {
public void saveUser(User user) {
log.info("保存用户:{}", user); // 直接使用 log 对象
// 业务逻辑...
}
}

空指针检查:@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;
// 自动生成校验:if (name == null) throw new NullPointerException("name is marked non-null but is null");
}
}

资源自动关闭:@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"); // 自动关闭
// 读取文件操作...
}
// 等价于 try (FileInputStream fis = ...) { ... }(try-with-resources)
}

异常处理:@SneakyThrows

  • 作用:偷偷捕获受检异常并抛出,无需在方法上声明 throws
  • 注意:不建议滥用,可能隐藏异常信息导致调试困难。
1
2
3
4
5
6
7
8
import lombok.SneakyThrows;  

public class Demo {
@SneakyThrows(InterruptedException.class) // 捕获 InterruptedException
public void sleep() {
Thread.sleep(1000); // 无需声明 throws
}
}

同步方法:@Synchronized

  • 作用:为方法添加同步锁,替代 synchronized 关键字,更安全(使用私有锁对象)。
1
2
3
4
5
6
7
8
9
10
import lombok.Synchronized;  

public class Counter {
private int count = 0;

@Synchronized // 等价于 synchronized (lock) { ... },lock 是私有对象
public void increment() {
count++;
}
}

使用 Lombok 的注意事项

  1. IDE 支持:必须安装 Lombok 插件(如 IntelliJ IDEA 需在插件市场搜索 “Lombok” 并启用),否则 IDE 会提示 “找不到方法”。
  2. 调试问题:生成的代码在编译后存在,但源码中不可见,调试时需查看反编译类(可通过 IDE 插件支持)。
  3. 继承问题@Data@EqualsAndHashCode 默认不包含父类字段,若需要需添加 callSuper = true
  4. 兼容性:部分框架(如 MyBatis、Jackson)依赖反射获取 getter/setter,Lombok 生成的方法完全兼容,可正常使用。
  5. 谨慎滥用@Data 虽便捷,但在包含大量字段的类中可能生成冗余的 equals()hashCode(),建议按需拆分注解。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10