Lombok库相关注解及用法

Lombok库相关注解及用法

Lombok 是一个 Java 工具库,通过注解自动生成常见的样板代码(如 getter/settertoString、构造函数等),从而减少代码量并提升开发效率。
但也存在相应风险:

  • 代码可读性:过度使用 @Data 可能隐藏字段细节,需谨慎处理敏感字段(如密码)。
  • 调试问题:使用 @Data 生成的 toString() 可能包含敏感信息,需注意日志安全。

一、使用方法

依赖添加

  • pom.xml 中添加依赖:
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.26</version>
        <scope>provided</scope>
    </dependency>
    
  • 安装 IntelliJ IDEA 或 Eclipse 的 Lombok 插件。

注解组合

  • 可通过组合注解实现复杂需求,例如:
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class User { ... }
    

二、基础注解

1. @Data

  • 作用:自动生成以下方法:
    • gettersetter
    • toString()
    • equals()hashCode()
    • is*() 方法(针对布尔类型字段)
  • 示例
    @Data
    public class User {
        private String name;
        private int age;
    }
    
  • 适用场景:快速为 POJO(Plain Old Java Object)生成所有常用方法。

2. @Getter@Setter

  • 作用:单独生成 gettersetter 方法。
  • 示例
    @Getter
    @Setter
    public class User {
        private String name;
        private int age;
    }
    

3. @ToString

  • 作用:生成 toString() 方法,默认包含所有字段。
  • 参数
    • includeFieldNames:是否包含字段名(默认 true)。
    • callSuper:是否调用父类的 toString()
    • of:指定类名(如 @ToString(of = {"name", "age"}))。
  • 示例
    @ToString(exclude = "password") // 排除 password 字段
    public class User {
        private String name;
        private String password;
    }
    

4. @EqualsAndHashCode

  • 作用:生成 equals()hashCode() 方法。
  • 参数
    • callSuper:是否调用父类的 equals()hashCode()
    • of:指定参与比较的字段。
    • exclude:排除某些字段。
  • 示例
    @EqualsAndHashCode(exclude = "id")
    public class User {
        private Long id;
        private String name;
    }
    

5. @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

  • 作用:生成无参构造函数、按 final@NonNull 字段生成构造函数、全参构造函数。
  • 示例
    // 生成无参构造函数
    @NoArgsConstructor
    public class User { ... }
    
    // 生成按 final 字段的构造函数
    @RequiredArgsConstructor
    public class User {
        private final String name;
        private int age;
    }
    
    // 生成全参构造函数
    @AllArgsConstructor
    public class User { ... }
    

三、进阶注解

1. @Builder

  • 作用:为类生成构建器模式(Builder Pattern)。
  • 示例
    @Builder
    public class User {
        private String name;
        private int age;
    }
    
  • 使用方式
    User user = User.builder()
                   .name("John")
                   .age(30)
                   .build();
    

2. @Value

  • 作用:生成不可变类(所有字段为 final),并包含 equalshashCodetoStringgetter
  • 示例
    @Value
    public class User {
        private final String name;
        private final int age;
    }
    

3. @SneakyThrows

  • 作用:隐式抛出受检异常(Checked Exception),无需显式 try-catch 或声明 throws
  • 示例
    public void readData() {
        @SneakyThrows
        public void readFile() {
            Files.readAllLines(Paths.get("file.txt")); // 无需处理 IOException
        }
    }
    

4. @Cleanup

  • 作用:自动关闭资源(类似 try-with-resources)。
  • 示例
    @Cleanup
    BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
    // 使用 reader 后自动关闭
    

5. @With

  • 作用:为类生成 withXxx() 方法,用于创建对象的拷贝并修改单个字段。
  • 示例
    @With
    public class User { ... }
    
  • 使用方式
    User newUser = originalUser.withName("NewName");
    

四、日志相关注解

1. @Slf4j

  • 作用:生成 private static final Logger log = LoggerFactory.getLogger(Class.class);
  • 示例
    @Slf4j
    public class MyService {
        public void doSomething() {
            log.info("This is a log message");
        }
    }
    
  • 其他变体
    • @Log4j:适用于 Log4j。
    • @CommonsLog:适用于 Commons Logging。
    • @XSlf4j:适用于 SLF4J + Lombok 的扩展。

五、其他实用注解

1. @Delegate

  • 作用:将接口方法委托给内部字段。
  • 示例
    public class User {
        @Delegate
        private final List<String> hobbies = new ArrayList<>();
    }
    // 现在 User 可以直接调用 List 的方法(如 add(), remove())
    

2. @NonNull

  • 作用:标记字段或参数为非空,若传入 null 会抛出 NullPointerException
  • 示例
    public void setUser(@NonNull User user) { ... }
    

3. @Synchronized

  • 作用:使方法或代码块线程安全(类似 synchronized 关键字)。
  • 示例
    @Synchronized
    public void updateData() { ... }
    
posted @ 2025-07-05 21:49  cwp0  阅读(17)  评论(0)    收藏  举报