Java 14的record是专为纯数据、无行为、不可变场景设计的语言级类型,天然适配DTO等载体,序列化、反射、泛型均获原生支持,无需Lombok或显式注解,但不可用作JPA实体。

Java 14起引入的record不是语法糖,而是专为“纯数据、无行为、不可变”场景设计的语言级类型。它天然适配现代API开发中对DTO、响应体、配置参数等载体的需求,且在序列化、反射、泛型等关键API层面获得直接支持,无需额外配置。
序列化框架开箱即用
主流JSON库(如Jackson、Gson)和XML工具(如JAXB)默认识别record结构:字段名即组件名,类型即声明类型,自动完成双向转换。
- 无需
@Data、@Getter等Lombok注解——record本身已生成访问器(如name()而非getName()) - 无需
@JsonProperty或@XmlElement显式标注——字段顺序与构造参数一致,命名直连 - 反序列化时,框架按名称匹配组件,失败则抛
JsonMappingException,语义清晰
反射API能安全读取但不可修改
record字段全部是public final,通过getDeclaredFields()可直接获取;但因不可变性约束,反射设值(set())会抛IllegalAccessException。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 适合只读分析场景:如自动生成OpenAPI文档、校验字段非空、构建通用日志模板
- 不支持运行时动态赋值,避免破坏不可变契约
-
Constructor<t></t>和Method(如toString())均可正常获取并调用
泛型与函数式API无缝集成
record可作为泛型类型参数、方法返回值、Stream元素或Lambda入参,JVM和编译器全程支持类型擦除与推断。
立即学习“Java免费学习笔记(深入)”;
- 常见写法:
record Result<t>(int code, String msg, T data) {}</t>,用作统一响应封装 - 配合
Stream.of(new Result<string>(200, "OK", "done"))</string>流畅处理 - 在函数式接口中作为参数(如
Consumer<user></user>),IDE自动补全字段访问
与Spring等主流框架协同良好
Spring Boot 2.6+、Micrometer、Spring Data JDBC等已适配record,但需注意边界:
- Controller层返回
record作为@ResponseBody,Jackson自动序列化 - 不能用作JPA实体(不支持继承、无setter、无无参构造器)
- 可作为
@RequestBody接收参数,但复杂校验建议用紧凑构造函数内联实现

















