lombok常用注解

Lombok 常用注解全解析:简化 Java 代码的利器

Lombok 是一款 Java 开发工具,通过注解自动生成模板代码(如 getter/setter、构造函数等),减少冗余代码,提高开发效率。本文将详细介绍 Lombok 的核心注解、使用场景及注意事项,帮助你快速掌握其用法。

Lombok 依赖配置

在 Maven 或 Gradle 项目中引入 Lombok 依赖,注意需配合 IDE 插件(如 IntelliJ IDEA 的 Lombok Plugin)使用,否则可能出现编译错误。

Maven 配置

<dependency>  
    <groupId>org.projectlombok</groupId>  
    <artifactId>lombok</artifactId>  
    <version>1.18.30</version> <!-- 推荐使用最新稳定版 -->  
    <scope>provided</scope> <!-- 编译时生效,不打包到运行环境 -->  
</dependency>

Gradle 配置

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 的场景。
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() 方法,默认包含所有非静态成员变量。
  • 使用场景:需要打印对象信息(如日志输出、调试)时。
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)。
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 字段 的构造函数。
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),快速减少模板代码。
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,支持链式调用创建对象。
  • 适用场景:成员变量较多时,替代多参构造函数,提高代码可读性。
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。
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 导致的潜在异常。
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
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
  • 注意:不建议滥用,可能隐藏异常信息导致调试困难。
import lombok.SneakyThrows;  

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

同步方法:@Synchronized

  • 作用:为方法添加同步锁,替代 synchronized 关键字,更安全(使用私有锁对象)。
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(),建议按需拆分注解。