Lombok 类库使用详解
Lombok 是一个 Java 库,通过注解自动生成常用的样板代码(如 getter/setter、构造函数、日志声明等),显著减少代码量,同时提高代码整洁度。
一、配置方法
(1)IDE:需安装 Lombok 插件(IntelliJ IDEA/Eclipse)
(2)构建工具:Maven/Gradle 添加依赖,如下:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
二、技术原理
Lombok 在编译期间通过注解处理器(Annotation Processor)修改抽象语法树(AST),直接生成字节码,因此不会影响运行时性能。
三、优缺点
1. 优点
(1)减少样板代码,提升可读性。
2. 缺点
(1)隐藏了实际代码,可能增加调试难度
(2)需团队统一规范,避免滥用
四、功能介绍
1. 简化 POJO 类代码
(1)@Getter / @Setter
作用:自动生成字段的 getter/setter 方法。
示例:
@Getter
@Setter
public class Student {
}
@Getter
@Setter
private String name;
扩展:可通过 AccessLevel 指定访问级别(如 @Getter(AccessLevel.PROTECTED))。
(2) @ToString
作用:生成 toString() 方法,包含所有字段或指定字段。
示例:
@ToString(exclude = "password")
public class User { ... }
(3)@EqualsAndHashCode
作用:生成 equals() 和 hashCode() 方法,默认使用所有非静态字段。
示例:
@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 等。
示例:
@Value
public class Point {
int x;
int y;
}
(9)@With
作用:生成不可变对象的副本并修改指定字段(类似 Kotlin 的 copy)。
示例:
@With
@AllArgsConstructor
public class User {
private String name;
}
User user = new User("Alice").withName("Bob");
2. 简化逻辑代码
(1)@Builder
作用:提供建造者模式 API。
示例:
@Builder
public class User {
private String name;
private int age;
}
// 使用
User user = User.builder().name("Alice").age(25).build();
注意:@Builder 会生成一个私有的全参构造函数,导致无法实例化对象。
(2) @SneakyThrows
作用:偷偷抛出受检异常,无需显式声明 throws。
示例:
@SneakyThrows(IOException.class)
public void readFile() {
Files.readAllBytes(Paths.get("file.txt"));
}
(3) @Cleanup
作用:自动调用资源的 close() 方法(如 IO 流)。
示例:
@Cleanup InputStream in = new FileInputStream("file.txt");
3. 扩展变量类型
(1) val
标识变量为 final 局部变量。
(2) var
用于局部变量类型推断。类似于 Java 10+ 的 var,所以JDK 10 以上不建议使用。
4. 日志注解
(1)注解与对应框架
| 注解 | 对应的日志框架 | 依赖示例(Maven) |
|---|---|---|
@Log |
java.util.logging (JUL) |
内置(无需额外依赖) |
@Log4j |
Apache Log4j 1.x | log4j:log4j:1.2.17 |
@Log4j2 |
Apache Log4j 2.x | org.apache.logging.log4j:log4j-core:2.x |
@Slf4j |
SLF4J(需绑定具体实现,如 Logback) | org.slf4j:slf4j-api:1.7.x |
@XSlf4j |
SLF4J 扩展(支持 MDC、标记等) | 同 @Slf4j |
@CommonsLog |
Apache Commons Logging | commons-logging:commons-logging:1.2 |
@Flogger |
Google Flogger | com.google.flogger:flogger:0.7.x |
@JBossLog |
JBoss Logging | org.jboss.logging:jboss-logging:3.4.x |
(2)自定义日志变量名
通过 topic 参数修改日志实例名称。
示例代码:
@Slf4j(topic = "AuditLogger")
public class Service {
public void run() {
log.info("Audit event"); // 使用名为 AuditLogger 的日志实例
}
}
(3)日志级别支持
自动生成 trace()、debug()、info()、warn()、error() 等方法。
(4)@XSlf4j 的 MDC 支持
结合 SLF4J 的 Mapped Diagnostic Context(MDC)实现日志上下文跟踪。
示例代码:
@XSlf4j
public class OrderService {
public void processOrder(String orderId) {
MDC.put("orderId", orderId);
log.info("Processing order"); // 日志中自动包含 orderId
MDC.clear();
}
}
(5)@Flogger 的性能优化
Google Flogger 专为高性能日志设计,支持延迟参数计算。
示例代码:
@Flogger
public class NetworkService {
public void sendRequest() {
log.atInfo().log("Request sent to %s", getRemoteHost()); // 仅当日志级别为 INFO 时计算参数
}
}
5. 锁相关注解
(1)@Synchronized
实现 synchronized 同步块。
用法:
import lombok.Synchronized;
public class SynchronizedExample {
private final Object readLock = new Object();
@Synchronized
public static void hello() {
System.out.println("world");
}
@Synchronized
public int answerToLife() {
return 42;
}
@Synchronized("readLock")
public void foo() {
System.out.println("bar");
}
}
实际运行代码:
public class SynchronizedExample {
private static final Object $LOCK = new Object[0];
private final Object $lock = new Object[0];
private final Object readLock = new Object();
public static void hello() {
synchronized($LOCK) {
System.out.println("world");
}
}
public int answerToLife() {
synchronized($lock) {
return 42;
}
}
public void foo() {
synchronized(readLock) {
System.out.println("bar");
}
}
}
(2)@Locked
实现 ReentrantReadWriteLock 和 ReentrantLock 锁。
用法:
import lombok.Locked;
public class LockedExample {
private int value = 0;
@Locked.Read
public int getValue() {
return value;
}
@Locked.Write
public void setValue(int newValue) {
value = newValue;
}
@Locked("baseLock")
public void foo() {
System.out.println("bar");
}
}
实际运行代码:
public class LockedExample {
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock baseLock = new ReentrantLock();
private int value = 0;
public int getValue() {
this.lock.readLock().lock();
try {
return value;
} finally {
this.lock.readLock().unlock();
}
}
public void setValue(int newValue) {
this.lock.writeLock().lock();
try {
value = newValue;
} finally {
this.lock.writeLock().unlock();
}
}
public void foo() {
this.baseLock.lock();
try {
System.out.println("bar");
} finally {
this.baseLock.unlock();
}
}
}
五、使用注意事项
1. 谨慎使用@Data,可能生成不必要的方法影响性能
@Data 注解会默认生成以下方法:toString()、equals()、hashCode()、getter/setter 方法、无参构造器,在大型项目中,自动生成这些方法可能会导致:性能损耗(如频繁调用
hashCode())、代码可读性下降、潜在的循环引用等问题。
2. 部分注解不适用于继承场景需特殊处理
部分注解在继承场景下需要特殊处理:
(1)@Builder 注解在父类使用时,子类需要手动实现构建器
(2)@AllArgsConstructor 不会包含父类的字段
(3)@Value 注解会使类变为 final,影响继承
六、总结建议
从实际使用情况看,Lombok 既能简化通用代码,又能使代码更简洁,未遇过明显问题,可推广应用。
七、参考文档
Lombok 类库使用详解的更多相关文章
- Lombok之使用详解
前言 在Java中,封装是一个非常好的机制,最常见的封装莫过于get,set方法了,无论是Intellij idea 还是Eclipse,都提供了快速生成get,set方法的快捷键,使用起来很是方便, ...
- IDEA2017.3.4破解方式及lombok图文配置详解
下载jetbrainsCrack-2.7-release-str.jar包 下载地址: https://files.cnblogs.com/files/xifenglou/JetBrains.zip ...
- 一篇关于apache commons类库的详解
1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...
- Intellij IDEA 安装lombok及使用详解
项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但 ...
- 一篇关于apache commons类库的详解[转]
1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...
- 34.Intellij IDEA 安装lombok及使用详解
转自:https://blog.csdn.net/qinxuefly/article/details/79159018 项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set ...
- C++类库开发详解(转)
前言:这是一篇总结性的文章,需要有一点C++和dll基本知识的基础,在网上查阅了很多资料感觉没有一篇详细.具体.全面的dll开发介绍,我这是根据最近项目和网上资料整理出来的,并附带实例的一个总结性的文 ...
- Lombok的使用详解与插件安装
JAVA面向对象编程中的封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问.这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性 ...
- Lombok的使用详解(最详尽的解释,覆盖讲解所有可用注解),解决@Builder.Default默认值问题
原文:https://blog.csdn.net/f641385712/article/details/82081900 前言 Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一 ...
- lombok+slf4j+logback SLF4J和Logback日志框架详解
maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...
随机推荐
- 探究高空视频全景AR技术的实现原理
1. 引言 笔者认为现阶段AR技术的应用是还是比较坑爹的,大都是噱头多但是实用的成分少,拿出来做做DEMO是可以,但是难以在实际的项目中落地产生实际的经济价值.一方面是很难在业务上难以找到合适的应用场 ...
- 基于Element的el-input实现一个可以显示千分位符的金额输入框
直接上代码 1 <template> 2 <!-- 定义一个 Element UI 的输入框组件 --> 3 <el-input 4 v-model="form ...
- go 定时任务库 cron
简介 在Linux中,Cron是计划任务管理系统,通过crontab命令使任务在约定的时间执行已经计划好的工作,例如定时备份系统数据.周期性清理缓存.定时重启服务等. 本文介绍的cron库是一个用于管 ...
- MySQL 常用优化
目录 单表优化 字段 索引 查询SQL 引擎 MyISAM InnoDB 系统调优参数 升级硬件 读写分离 缓存 表分区 分区的好处是: 分区的限制和缺点: 分区的类型: 分区适合的场景有: 垂直拆分 ...
- UNIX 系统
UNIX 系统的历史,UNIX 是操作系统的开山鼻祖,是操作系统的发源地,后来的 Windows 和 Linux 都参考了 UNIX. 有人说,这个世界上只有两种操作系统: UNIX 和类 UNIX ...
- Linux 系统出现异常排查思路
16 系统出现异常排查思路16.1 查看用户信息16.1.1查看当前的用户# who 04:39:39 up 1:30, 1 user, load average: 0.01, 0.01, 0. ...
- ShardingSphere分组聚合,数据异常问题
在使用ShardingSphere分组聚合时是,出现了数据汇总不正确问题.我这里只进行了分表,未进行分库.使用的是广播查询,因为是定时任务统计,无法使用到分片键.进行分组的字段是两个 1. SQL查询 ...
- Efficient Scalable Multi-Party Private Set Intersection
论文学习:Efficient Scalable Multi-Party Private Set Intersection 这篇论文提出了一种基于双中心零共享(Bicentric Zero-Sharin ...
- 2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装;第二种:docker 容器安装)
2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装:第二种:docker 容器安装) @ 目录 2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装:第二种:do ...
- 终于有人把ROS机器人操作系统讲明白了
终于有人把ROS机器人操作系统讲明白了 导读:机器人是多专业知识交叉的学科,通常涉及传感器.驱动程序.多机通信.机械结构.算法等,为了更高效地进行机器人的研究和开发,选择一个通用的开发框架非常必要,R ...