record
一、Record 是什么?
Record 是 Java 16 正式引入的一种特殊的类类型,专门用于透明地承载不可变数据。它用一行代码替代了传统 Java 类中大量的样板代码。
public record UserRecord (String username, int age, String email) {
}
import java.util.Objects;
public final class UserRecord extends java.lang.Record {
private final String username;
private final int age;
private final String email;
public UserRecord(String username, int age, String email) {
this.username = username;
this.age = age;
this.email = email;
}
public String username() {
return username;
}
public int age() {
return age;
}
public String email() {
return email;
}
@Override
public String toString() {
return "UserRecord[username=" + username + ", age=" + age + ", email=" + email + "]";
}
@Override
public int hashCode() {
return Objects.hash(username, age, email);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
UserRecord that = (UserRecord) obj;
return age == that.age &&
Objects.equals(username, that.username) &&
Objects.equals(email, that.email);
}
}
二、Record 的核心特性
1. 自动生成的方法
| 方法 | 生成规则 | 示例(UserRecord) |
|---|
| 构造器 | 全参数构造器,参数顺序与声明一致 | new UserRecord("张三", 25, "zhangsan@example.com") |
| 访问器 | 与字段同名,没有 get 前缀 | user.username()、user.age() |
toString() | 格式:类名[字段1=值1, 字段2=值2, ...] | UserRecord[username=张三, age=25, email=zhangsan@example.com] |
hashCode() | 基于所有字段计算 | Objects.hash(username, age, email) |
equals() | 比较所有字段的值 | 所有字段相等才返回 true |
2. 不可变性
- 所有字段都是
private final 的 - 对象一旦创建,字段值不可修改
- 天然线程安全,适合函数式编程
3. 继承限制
- Record 是
final 类,不能被继承 - 所有 Record 都隐式继承自
java.lang.Record
4. 类级别特性
| 特性 | 支持情况 |
|---|
| 实现接口 | ✅ 可以 |
| 继承类 | ❌ 不能(已经是 final) |
| 泛型 | ✅ 支持 |
| 静态字段/方法 | ✅ 支持 |
| 实例方法 | ✅ 支持(自定义) |
| 注解 | ✅ 支持(可传播到字段/访问器) |
5. 用法
(1)带校验的构造器(紧凑构造器)
public record UserRecord (String username, int age, String email) {
public UserRecord{
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
if (username == null || username.trim().isEmpty()) {
throw new IllegalArgumentException("姓名不能为空");
}
email = email.substring(0);
}
}
(2)自定义构造器
public record UserRecord (String username, int age, String email) {
public UserRecord{
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
if (username == null || username.trim().isEmpty()) {
throw new IllegalArgumentException("姓名不能为空");
}
email = email.substring(0);
}
public UserRecord(String username) {
this(username, 0,"abc@qq.com");
}
}