Java新特性-record
Java 14 引入、15 预览、16 正式孵化的 record 是一种不可变的数据载体类(“数据类”)。它的设计目标就是:
用最少的代码,声明一个只存数据的透明载体。
record
是 语法糖,编译器帮你自动生成:
所有字段(
private final
)全参构造器
每个字段的
public
访问器(name()
、age()
)
equals / hashCode / toString
(基于全部字段)实现
Serializable
等接口的便利
🆚 传统写法 vs record
传统 POJO
public final class Point {private final int x;private final int y;public Point(int x, int y) {this.x = x;this.y = y;}public int x() { return x; }public int y() { return y; }@Override public boolean equals(Object o) { ... }@Override public int hashCode() { ... }@Override public String toString() { ... }
}
record 写法
public record Point(int x, int y) {}
🔍 语法细节
1. 基本声明
java
public record User(long id, String name, LocalDate birth) {}
2. 可添加的额外成员
可以定义静态字段 / 静态方法 / 实例方法
可以定义紧凑构造器做参数校验
java
public record Range(int lo, int hi) {public Range {if (lo > hi) throw new IllegalArgumentException("lo > hi");}
}
可以实现接口,但 不能继承类(隐式继承
java.lang.Record
)可以显式声明泛型:
java
public record Pair<T, U>(T first, U second) {}
❗限制 & 注意
所有字段都是
final
,record 本身也是final
(不可被继承)。不能声明额外的实例字段,只能有头部声明的组件。
序列化:虽然可
implements Serializable
,但官方仍建议用普通类或 DTO。反射/序列化框架兼容性:Jackson、JPA 等已支持,但老版本需升级。
🧪 使用场景
场景 | 示例 |
---|---|
DTO / VO | UserDTO , ApiResponse<T> |
多返回值 | record Result<T>(T data, String error) |
轻量级不可变元组 | record Coord(double lat, double lng) |
Map 的复合 key | record Key(String type, long id) |
✅ 与 Lombok 对比
特性 | record | Lombok @Value |
---|---|---|
来源 | JDK 原生 | 第三方库 |
不可变性 | 强制 | 可选 |
代码量 | 最少 | 需引入依赖 |
额外功能 | 无 | Builder、Wither 等 |
学习/维护成本 | 零 | 需理解注解 |
🎉 结论
record 让 Java 拥有了原生、简洁、零依赖的“数据类”,特别适合不可变 DTO、值对象、多返回值等场景。
从 Java 16 起,放心在正式环境使用!