一、record 的诞生背景
java 的 record(记录类)是 java 14 引入的预览特性,于 java 16 正式标准化。其设计初衷是简化不可变数据类的定义,解决传统 pojo 类中大量样板代码(如构造器、getter、equals、hashcode、tostring 等)的问题。例如,一个简单的 person
类在传统写法中需要 30+ 行代码,而用 record 只需一行。
传统类 vs record 类:
// 传统 pojo(30+ 行) public class person { private final int id; private final string name; // 构造器、getter、equals、hashcode、tostring... } // record 等效实现(1 行) public record person(int id, string name) {}
通过 record,开发者可以专注于数据本身,而非重复的模板代码。
二、record 的核心特性
不可变性
- record 的所有字段默认是
final
的,创建后不可修改,天然线程安全。 - 适用于 dto、配置项等需要数据一致性的场景。
- record 的所有字段默认是
自动生成方法
- 编译器自动生成以下方法:
- 全参构造器
- 字段访问器(如
id()
、name()
,而非getid()
) equals()
、hashcode()
、tostring()
。
- 编译器自动生成以下方法:
简洁语法
- 使用
record
关键字定义,语法紧凑:public record point(int x, int y) {}
- 使用
限制性设计
- record 类是隐式
final
的,不可被继承。 - 不能声明非静态实例字段(仅允许通过参数列表定义字段)。
- record 类是隐式
三、record 的基本用法
1. 定义与实例化
public record user(string username, string email) {} // 实例化 user user = new user("alice", "alice@example.com"); system.out.println(user.username()); // 输出 "alice"
2. 自定义方法
record 允许添加自定义方法:
public record circle(double radius) { // 计算面积 public double area() { return math.pi * radius * radius; } }
3. 参数校验(紧凑构造器)
通过紧凑构造器实现字段校验:
public record email(string address) { public email { if (!address.contains("@")) { throw new illegalargumentexception("invalid email"); } } }
4. 实现接口与泛型
record 可以实现接口,支持泛型:
public record pair<t, u>(t first, u second) implements serializable { public string tojson() { return "{ \"first\": \"" + first + "\", \"second\": \"" + second + "\" }"; } }
四、record 的进阶应用
替代 dto/vo
- 快速定义 api 响应模型:
public record apiresponse<t>(int code, string message, t data) {}
- 快速定义 api 响应模型:
模式匹配(java 17+)
- 结合
instanceof
解构数据:object obj = new point(3, 4); if (obj instanceof point(int x, int y)) { system.out.println("坐标: (" + x + ", " + y + ")"); }
- 结合
数据库映射
- 简化 jdbc 结果集处理:
try (resultset rs = statement.executequery()) { return new user(rs.getint("id"), rs.getstring("name")); }
- 简化 jdbc 结果集处理:
函数式编程
- 作为轻量级元组(如
pair
、triple
):record pair<a, b>(a first, b second) {} list<pair<string, integer>> pairs = list.of(new pair<>("java", 1995));
- 作为轻量级元组(如
五、record 与 lombok 的对比
特性 | record | lombok |
---|---|---|
不可变性 | 默认支持 | 需手动添加 final |
代码生成 | 语言原生支持 | 依赖注解处理器 |
模式匹配 | 完全兼容 | 不支持 |
兼容性 | 需 jdk 16+ | 兼容旧版本 |
可变性 | 不可变 | 支持可变类(如 @data ) |
选择建议:
- 优先 record:需不可变类、使用模式匹配或 jdk 16+ 环境。
- 选择 lombok:需可变类或兼容旧代码。
六、注意事项
不可继承性
- record 不能继承其他类(隐式继承
java.lang.record
)。
- record 不能继承其他类(隐式继承
字段限制
- 所有字段必须通过参数列表声明,不支持动态添加实例字段。
序列化
- 需显式实现
serializable
接口。
- 需显式实现
框架兼容性
- 部分框架(如旧版 spring)可能需适配 record 类型。
七、未来展望
- 模式匹配增强:与
sealed class
结合,构建更严格的类型系统。 - 框架整合:spring 等框架或默认支持 record 作为数据载体。
- 函数式扩展:与 stream、optional 深度结合,提升代码表现力。
总结
java record 通过极简语法和不可变性,显著减少了数据类的样板代码,同时提升了代码安全性和可维护性。其适用于 dto、模式匹配、函数式编程等场景。
到此这篇关于java record基本用法详解的文章就介绍到这了,更多相关java record内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论