Java 记录类与 Lombok 数据类如何选择
Java 的 record 和 Lombok 的 @Data 都能让数据类少写很多样板代码,但它们解决的不是同一个问题:record 是语言级的“固定数据载体”契约,@Data 是编译期生成 JavaBean 样板成员的工程工具。选择时先问对象是否应该被修改、调用方是否依赖 getXxx()/setXxx(),再看框架和继承约束。
可以先记住一个实用结论:接口请求/响应 DTO、查询结果和只读值对象,优先考虑 record;需要 setter、无参构造、JavaBean 绑定、继承或渐进式改造的对象,优先考虑 Lombok 或普通 class。
record 和 @Data 的最小写法差在哪里
两种写法都可以表达姓名和年龄,但外部看到的 API 完全不同。record 的组件会形成私有 final 字段、同名访问器、规范构造器以及值语义方法;@Data 则默认为非 final 字段生成 getter 和 setter,并生成所需构造器。
// record 表达“创建后按组件读取”的固定数据载体
public record UserView(String name, int age) {
// 紧凑构造器适合集中放置创建时的参数约束
public UserView {
if (age
UserView 使用 user.name() 读取,不能调用 setter;UserForm 使用 getName()、setName() 等方法。注意 record 是浅层不可变:组件引用本身不能换,但组件若是可变集合,集合内容仍可能变化。

先比较五个真正影响选型的维度
| 维度 | record | Lombok @Data |
|---|---|---|
| 变化方式 | 组件字段 final,创建后不能重新赋值 | 非 final 字段默认有 setter,可按注解细调 |
| 访问器 | name()、age() | getName()、setName() |
| 继承 | record 隐式 final,不能继承其他类 | 普通 class,可按现有类层次设计 |
| 构造器 | 组件决定规范构造器,可用紧凑构造器校验 | 默认生成 required constructor;显式构造器会影响生成规则 |
| 工具链 | 编译器直接理解,减少注解处理器依赖 | 需要 Lombok 与 IDE、编译器、构建链协同 |
因此,“代码更短”不是充分条件。若旧框架通过反射寻找 getName,record 的 name() 可能不满足它;反过来,若对象作为缓存键或跨层传递,随意暴露 setter 会让状态变化变得难以追踪。
按场景做选择:DTO、配置对象和领域实体
接口 DTO 和查询投影:字段通常在边界处一次构造、随后只读,record 能把契约写在类型声明里。序列化框架是否支持 record 要结合项目版本和模块配置确认,不能只因为语言支持就默认所有旧框架都支持。
配置对象和表单对象:如果绑定流程需要先创建空对象、再逐个调用 setter,或者配置系统依赖标准 getter/setter,@Data 更顺手;如果配置是在启动时完整解析并冻结,也可以用 record,并显式提供适配层。
领域实体:实体往往有生命周期、身份和受控变更,不宜因为字段多就直接套 @Data。可以使用普通 class,或者只为不可变快照、值对象使用 record。无论选择哪种方案,都应明确 equals/hashCode 是按全部字段还是按业务身份定义。

迁移时怎样避免“能编译但行为变了”
把旧的 Lombok 数据类改成 record,不只是把类声明换一行。调用方必须把 getter 改成组件访问器,所有修改动作改为重新构造对象;依赖无参构造、反射写字段、代理继承或 JavaBean 命名的框架也要单独确认。
// DTO 转换放在边界层,领域内部只接收已经完成校验的值
public record UserResponse(String name, int age) {
// 通过工厂方法隐藏外部数据到 DTO 的转换细节
public static UserResponse from(UserEntity entity) {
return new UserResponse(entity.getName(), entity.getAge());
}
}
// 如果旧调用方必须使用 setter,先保留表单模型,不要强行改成 record
@lombok.Data
public class UserCommand {
private String name;
private int age;
}
迁移顺序可以是:先把 record 用在新建的边界 DTO;再为旧框架保留 Lombok 表单类;最后通过转换方法隔离两者。这样既能获得不可变对象的清晰契约,也不会把框架适配成本扩散到领域代码。
常见问题
record 是不是绝对不可变?
不是。record 的组件引用不能重新赋值,但引用指向的对象可能仍可变。需要深层不可变时,还要选择不可变集合、拷贝输入或在构造器中完成防御性复制。
@Data 能不能直接替代 record?
不能简单替代。@Data 适合减少普通 class 的 getter、setter、构造器和对象方法样板;record 还表达了 final、组件访问器、不能继承类等语言级约束。
项目已经用了 Lombok,还要引入 record 吗?
可以按边界引入,不需要一次性迁移。新 DTO 和值对象优先使用 record,已有 JavaBean 绑定对象继续使用 Lombok,等调用契约自然收敛后再评估更大范围的改造。
最终的选择规则可以压缩成一句话:对象是“创建后携带一组固定值”,选 record;对象需要被框架逐步填充、需要 setter 或参与既有继承体系,选 Lombok 或普通 class。先确定对象契约,再决定用哪种语法,迁移风险会小得多。
Java Gradle configuration cache 不生效怎么办
- 上一篇
- Java Gradle configuration cache 不生效怎么办
- 下一篇
- Java JUnit 5 参数化测试怎样组织输入
-
- 文章 · java教程 | 1小时前 |
- Java 线程池队列过长怎样设置背压
- 311浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java GC 日志怎样定位暂停时间来源
- 306浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java JUnit 5 参数化测试怎样组织输入
- 110浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java Gradle configuration cache 不生效怎么办
- 281浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java Jackson 多态 JSON 怎样保留类型信息
- 126浏览 收藏
-
- 文章 · java教程 | 1小时前 | Java教程 · java equals bigdecimal compareTo scale 金额比较
- Java BigDecimal 比较为什么不能直接用 equals
- 499浏览 收藏
-
- 文章 · java教程 | 1小时前 | 资源管理 · Stream · Java教程 · java path nio Stream try-with-resources Files.walk
- Java Files.walk 怎样确保遍历流及时关闭
- 180浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java 虚拟线程怎样避免阻塞同步池化资源
- 444浏览 收藏
-
- 文章 · java教程 | 1小时前 | 异步编程 · Java教程 · CompletableFuture · 进程管理 · java completablefuture process ProcessHandle onExit 异步进程
- Java Process.onExit 怎样异步等待子进程结束
- 233浏览 收藏
-
- 文章 · java教程 | 18小时前 | 文件处理 · Java · java InputStream 文件摘要 Apache Commons Codec DigestUtils
- Java Commons Codec怎样流式计算文件摘要
- 370浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 469次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 530次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 549次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 499次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 317次使用
-
- Java try-with-resources 多个资源关闭顺序是什么
- 2026-09-10 501浏览
-
- 矩阵主副对角线快速定位技巧
- 2026-05-31 501浏览
-
- Java多态优化流程代码与行为分发改进
- 2026-05-26 501浏览
-
- JVM 类元数据双亲委派链表深度解析
- 2026-05-21 501浏览
-
- 反射异常处理:InvocationTargetException解析与应用
- 2026-05-16 501浏览
