深度解析Java记录类
痛点:传统POJO的样板代码地狱
在记录类出现前,Java定义一个纯数据载体需手动编写大量重复代码:
public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
// 冗长的getter/equals/hashCode/toString...
}
记录类的核心特性
- 极简声明
一行代码替代整个类:
public record Point(int x, int y) { }
- 自动实现核心方法
编译器自动生成:
· 全字段构造器 Point(int x, int y)
· 访问器 x() 和 y()(注意非getX())
· equals() 与 hashCode()
· 字段可视化 toString() - 不可变性保障
所有字段隐式为 final,创建后状态不可变,保障线程安全。
进阶用法示例
public record Location(String name, double lat, double lng) {
// 自定义紧凑构造器进行校验
public Location {
if (lat < -90 || lat > 90)
throw new IllegalArgumentException("Invalid latitude");
name = name.trim(); // 可对参数重新赋值
}
// 添加自定义方法
public String toUrl() {
return "https://maps.com/?q=" + lat + "," + lng;
}
}
// 使用示例
Location office = new Location("HQ", 37.7749, -122.4194);
System.out.println(office.name()); // 输出:HQ
System.out.println(office.toUrl()); // 输出地图URL
关键限制与适用场景
· ❌ 不可继承类:隐含继承 Record 类(final)
· ❌ 不可添加非static字段:仅允许声明中的组件字段
· ✅ 最佳场景:API响应DTO、数据库查询投影、元组替代品、配置对象
· 🚫 避免场景:需要继承、动态字段或复杂内部状态的业务模型
版本要求:Java 14+(预览),Java 16+(正式功能)
记录类以声明即定义的哲学重塑Java数据建模方式,在减少代码量的同时提升安全性与可读性。它并非取代传统类,而是为特定场景提供精准解决方案,让Java在数据封装领域焕发新生。

被折叠的 条评论
为什么被折叠?



