一、什么是 record?
record 是从 Java 14(正式在 Java 16)引入的一种特殊类,用来快速定义"只读数据类"。
👉 本质一句话:
record = 自动生成的不可变(只读)数据类
二、最简单的例子 🌰
java
public record User(String name, int age) {}
这一行代码,其实帮你自动生成了👇:
java
final class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String name() { return name; }
public int age() { return age; }
// 自动生成
public boolean equals(Object o) { ... }
public int hashCode() { ... }
public String toString() { ... }
}
三、为什么说它是"只读类"?🔒
1️⃣ 所有属性都是 final
java
private final String name;
👉 一旦赋值,不能修改
2️⃣ 没有 setter 方法
java
user.setName("Tom"); // ❌ 不存在
👉 只能读,不能改
3️⃣ 类本身是隐式 final
java
public record User(...) {}
👉 不能被继承
4️⃣ 数据不可变(核心思想🔥)
java
User u = new User("Alice", 20);
// u.name = "Bob"; ❌ 不允许
👉 想改?只能 new 一个新的对象
四、常用特性
1️⃣ 自动生成方法(非常香✨)
- 构造方法
- getter(注意:不是 getName(),而是 name())
equals()hashCode()toString()
2️⃣ 可以自定义构造方法
java
public record User(String name, int age) {
public User {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
}
}
👉 这叫"紧凑构造器"
3️⃣ 可以加方法(但不能改字段)
java
public String info() {
return name + "-" + age;
}
五、record vs 普通类 ⚔️
| 对比项 | record | 普通类 |
|---|---|---|
| 是否可变 | ❌ 不可变 | ✅ 可变 |
| setter | ❌ 没有 | ✅ 有 |
| getter | 自动生成 | 手写 |
| equals/hashCode | 自动 | 手写 |
| 代码量 | 极少 | 较多 |
| 继承 | ❌ 不可继承 | ✅ 可以 |
六、适用场景 🎯
record 特别适合:
✔ DTO(数据传输对象)
✔ VO(返回对象)
✔ API返回数据
✔ 配置数据
✔ 不需要修改的数据结构
七、不适用场景 ❌
❌ 需要频繁修改字段
❌ 需要继承
❌ 复杂业务对象(有很多行为)