登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
资源区
›
代码
›
Java 样板代码库 Lombok 使用详解
Java 样板代码库 Lombok 使用详解
[ 复制链接 ]
廖雯华
2025-6-4 10:35:07
Lombok 是一个 Java 库,通过注解自动生成常用的样板代码(如 getter/setter、构造函数、日志声明等),显著减少代码量,同时提高代码整洁度。
一、配置方法
(1)IDE:需安装 Lombok 插件(IntelliJ IDEA/Eclipse)
(2)构建工具:Maven/Gradle 添加依赖,如下:
<dependency>
<groupId>org.projectlombok</groupId>
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)@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 参数修改日志实例名称。
示例代码:
@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 既能简化通用代码,又能使代码更简洁,未遇过明显问题,可推广应用。
七、参考文档
(1)lombok features
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
Java
样板
代码
Lombok
使用
相关帖子
6 大企业级无代码低代码平台 RBAC 权限体系深度对比
使用netfilter_queue重定向IP数据包
使用 GeckoCircuits 设计 Buck 电源环路
代码复杂度的代价远比你想象得大
《刚刚问世》系列初窥篇-Java+Playwright自动化测试
【入门】使用Node.js开发一个MCP服务器
使用QSPI驱动PM004MNIA
深入理解Java线程安全与锁优化
出海 AI 公司招 Java 大佬|北京
React 中 useCallback 的基本使用和原理解析
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
6 大企业级无代码低代码平台 RBAC 权限体系深度对比
0
986
泥地锚
2025-11-01
安全
使用netfilter_queue重定向IP数据包
0
267
杭环
2025-11-02
安全
使用 GeckoCircuits 设计 Buck 电源环路
0
191
俏挺喳
2025-11-02
业界
代码复杂度的代价远比你想象得大
0
161
古修蟑
2025-11-02
业界
《刚刚问世》系列初窥篇-Java+Playwright自动化测试
0
14
施婉秀
2025-11-03
业界
【入门】使用Node.js开发一个MCP服务器
0
851
步雪卉
2025-11-03
安全
使用QSPI驱动PM004MNIA
0
770
琴丁辰
2025-11-04
业界
深入理解Java线程安全与锁优化
0
650
准挝
2025-11-04
安全
出海 AI 公司招 Java 大佬|北京
0
751
全叶农
2025-11-05
业界
React 中 useCallback 的基本使用和原理解析
0
537
彭水晶
2025-11-05
回复
(1)
嗦或
前天 05:54
回复
使用道具
举报
照妖镜
谢谢楼主提供!
vip免费申请,1年只需15美金$
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
业界
签约作者
程序园优秀签约作者
发帖
廖雯华
前天 05:54
关注
0
粉丝关注
18
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
dage888
999994
3934307807
992122
4
xiangqian
641213
5
刎唇
9993
6
荡俊屯
9948
7
匝抽
9986
8
二艰糖
9970
9
宓碧莹
9988
10
终秀敏
9990
查看更多