找回密码
 立即注册
首页 资源区 代码 Java 样板代码库 Lombok 使用详解

Java 样板代码库 Lombok 使用详解

廖雯华 3 天前
Lombok 是一个 Java 库,通过注解自动生成常用的样板代码(如 getter/setter、构造函数、日志声明等),显著减少代码量,同时提高代码整洁度。
一、配置方法

(1)IDE:需安装 Lombok 插件(IntelliJ IDEA/Eclipse)
(2)构建工具:Maven/Gradle 添加依赖,如下:
  1. <dependency>
  2.     <groupId>org.projectlombok</groupId>
  3.     lombok</artifactId>
  4.     <version>1.18.30</version>
  5.     <scope>provided</scope>
  6. </dependency>
复制代码
二、技术原理

Lombok 在编译期间通过注解处理器(Annotation Processor)修改抽象语法树(AST),直接生成字节码,因此不会影响运行时性能。
三、优缺点

1. 优点

(1)减少样板代码,提升可读性。
2. 缺点

(1)隐藏了实际代码,可能增加调试难度
(2)需团队统一规范,避免滥用
四、功能介绍

1. 简化 POJO 类代码

(1)@Getter / @Setter
作用:自动生成字段的 getter/setter 方法。
示例:
  1. @Getter
  2. @Setter
  3. public class Student {
  4. }
  5. @Getter
  6. @Setter
  7. private String name;
复制代码
扩展:可通过 AccessLevel 指定访问级别(如 @Getter(AccessLevel.PROTECTED))。
(2) @ToString
作用:生成 toString() 方法,包含所有字段或指定字段。
示例:
  1. @ToString(exclude = "password")
  2. public class User { ... }
复制代码
(3)@EqualsAndHashCode
作用:生成 equals() 和 hashCode() 方法,默认使用所有非静态字段。
示例:
  1. @EqualsAndHashCode(callSuper = true) // 包含父类字段
复制代码
(4)@NoArgsConstructor
生成无参构造方法,force 参数可强制初始化 final 字段为 0/false/null。
(5)RequiredArgsConstructor
为 final 字段和@NonNull 字段生成构造方法,适合依赖注入场景。
(6)@AllArgsConstructor
生成全参构造方法,按字段声明顺序排列参数。
(7)@Data
作用:组合注解,包含 @Getter、@Setter、@ToString、@EqualsAndHashCode 和 @RequiredArgsConstructor。
适用场景:POJO 类简化。
(8)@Value
作用:生成不可变类(所有字段为 final),组合 @Getter、@ToString、@EqualsAndHashCode 等。
示例:
  1. @Value
  2. public class Point {
  3.   int x;
  4.   int y;
  5. }
复制代码
(9)@With
作用:生成不可变对象的副本并修改指定字段(类似 Kotlin 的 copy)。
示例:
  1. @With
  2. @AllArgsConstructor
  3. public class User {
  4.    private String name;
  5. }
  6. User user = new User("Alice").withName("Bob");
复制代码
2. 简化逻辑代码

(1)@Builder
作用:提供建造者模式 API。
示例:
  1. @Builder
  2. public class User {
  3.     private String name;
  4.     private int age;
  5. }
  6. // 使用
  7. User user = User.builder().name("Alice").age(25).build();
复制代码
注意:@Builder 会生成一个私有的全参构造函数,导致无法实例化对象。
(2) @SneakyThrows
作用:偷偷抛出受检异常,无需显式声明 throws。
示例:
  1. @SneakyThrows(IOException.class)
  2. public void readFile() {
  3.     Files.readAllBytes(Paths.get("file.txt"));
  4. }
复制代码
(3) @Cleanup
作用:自动调用资源的 close() 方法(如 IO 流)。
示例:
  1. @Cleanup InputStream in = new FileInputStream("file.txt");
复制代码
3. 扩展变量类型

(1) val
标识变量为 final 局部变量。
(2) var
用于局部变量类型推断。类似于 Java 10+ 的 var,所以JDK 10 以上不建议使用。
4. 日志注解

(1)注解与对应框架
注解对应的日志框架依赖示例(Maven)@Logjava.util.logging (JUL)内置(无需额外依赖)@Log4jApache Log4j 1.xlog4j:log4j:1.2.17@Log4j2Apache Log4j 2.xorg.apache.logging.log4j:log4j-core:2.x@Slf4jSLF4J(需绑定具体实现,如 Logback)org.slf4j:slf4j-api:1.7.x@XSlf4jSLF4J 扩展(支持 MDC、标记等)同 @Slf4j@CommonsLogApache Commons Loggingcommons-logging:commons-logging:1.2@FloggerGoogle Floggercom.google.flogger:flogger:0.7.x@JBossLogJBoss Loggingorg.jboss.logging:jboss-logging:3.4.x(2)自定义日志变量名
通过 topic 参数修改日志实例名称。
示例代码:
  1. @Slf4j(topic = "AuditLogger")
  2. public class Service {
  3.     public void run() {
  4.         log.info("Audit event"); // 使用名为 AuditLogger 的日志实例
  5.     }
  6. }
复制代码
(3)日志级别支持
自动生成 trace()、debug()、info()、warn()、error() 等方法。
(4)@XSlf4j 的 MDC 支持
结合 SLF4J 的 Mapped Diagnostic Context(MDC)实现日志上下文跟踪。
示例代码:
  1. @XSlf4j
  2. public class OrderService {
  3.     public void processOrder(String orderId) {
  4.         MDC.put("orderId", orderId);
  5.         log.info("Processing order"); // 日志中自动包含 orderId
  6.         MDC.clear();
  7.     }
  8. }
复制代码
(5)@Flogger 的性能优化
Google Flogger 专为高性能日志设计,支持延迟参数计算。
示例代码:
  1. @Flogger
  2. public class NetworkService {
  3.     public void sendRequest() {
  4.         log.atInfo().log("Request sent to %s", getRemoteHost()); // 仅当日志级别为 INFO 时计算参数
  5.     }
  6. }
复制代码
5. 锁相关注解

(1)@Synchronized
实现 synchronized 同步块。
用法:
  1. import lombok.Synchronized;
  2. public class SynchronizedExample {
  3.   private final Object readLock = new Object();
  4.   
  5.   @Synchronized
  6.   public static void hello() {
  7.     System.out.println("world");
  8.   }
  9.   
  10.   @Synchronized
  11.   public int answerToLife() {
  12.     return 42;
  13.   }
  14.   
  15.   @Synchronized("readLock")
  16.   public void foo() {
  17.     System.out.println("bar");
  18.   }
  19. }
复制代码
实际运行代码:
  1. public class SynchronizedExample {
  2.   private static final Object $LOCK = new Object[0];
  3.   private final Object $lock = new Object[0];
  4.   private final Object readLock = new Object();
  5.   
  6.   public static void hello() {
  7.     synchronized($LOCK) {
  8.       System.out.println("world");
  9.     }
  10.   }
  11.   
  12.   public int answerToLife() {
  13.     synchronized($lock) {
  14.       return 42;
  15.     }
  16.   }
  17.   
  18.   public void foo() {
  19.     synchronized(readLock) {
  20.       System.out.println("bar");
  21.     }
  22.   }
  23. }
复制代码
(2)@Locked
实现 ReentrantReadWriteLock 和 ReentrantLock 锁。
用法:
  1. import lombok.Locked;
  2. public class LockedExample {
  3.   private int value = 0;
  4.   
  5.   @Locked.Read
  6.   public int getValue() {
  7.     return value;
  8.   }
  9.   
  10.   @Locked.Write
  11.   public void setValue(int newValue) {
  12.     value = newValue;
  13.   }
  14.   
  15.   @Locked("baseLock")
  16.   public void foo() {
  17.     System.out.println("bar");
  18.   }
  19. }
复制代码
实际运行代码:
  1. public class LockedExample {
  2.   private final ReadWriteLock lock = new ReentrantReadWriteLock();
  3.   private final Lock baseLock = new ReentrantLock();
  4.   private int value = 0;
  5.   
  6.   public int getValue() {
  7.     this.lock.readLock().lock();
  8.     try {
  9.       return value;
  10.     } finally {
  11.       this.lock.readLock().unlock();
  12.     }
  13.   }
  14.   
  15.   public void setValue(int newValue) {
  16.     this.lock.writeLock().lock();
  17.     try {
  18.       value = newValue;
  19.     } finally {
  20.       this.lock.writeLock().unlock();
  21.     }
  22.   }
  23.   
  24.   public void foo() {
  25.     this.baseLock.lock();
  26.     try {
  27.       System.out.println("bar");
  28.     } finally {
  29.       this.baseLock.unlock();
  30.     }
  31.   }
  32. }
复制代码
五、使用注意事项

1. 谨慎使用@Data,可能生成不必要的方法影响性能

@Data 注解会默认生成以下方法:toString()、equals()、hashCode()、getter/setter 方法、无参构造器,在大型项目中,自动生成这些方法可能会导致:性能损耗(如频繁调用
hashCode())、代码可读性下降、潜在的循环引用等问题。
2. 部分注解不适用于继承场景需特殊处理

部分注解在继承场景下需要特殊处理:
(1)@Builder 注解在父类使用时,子类需要手动实现构建器
(2)@AllArgsConstructor 不会包含父类的字段
(3)@Value 注解会使类变为 final,影响继承
六、总结建议

从实际使用情况看,Lombok 既能简化通用代码,又能使代码更简洁,未遇过明显问题,可推广应用。
七、参考文档

(1)lombok features

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册