记录类是 Java 17 推出的新特性,它在不牺牲语义清晰度的前提下,极大地简化了数据载体类(DTO)的编写。下面从概念、语法、性能、适用场景以及注意事项四个角度深入剖析。
1. 记录类到底是什么
记录类(record)是一种特殊的 Java 类,专门用于存储不可变的数据。它们自动提供:
| 功能 | 说明 |
|---|---|
equals() |
基于所有字段实现 |
hashCode() |
与 equals() 一致 |
toString() |
生成易读字符串 |
| 访问器 | 自动生成 getter(命名为字段名) |
| 构造器 | 自动生成全参构造器 |
clone() |
继承自 Object,不重写 |
因为所有字段默认是 private final,所以记录类天然是线程安全的。
2. 语法示例
public record Person(String name, int age, String email) {}
这条语句即可定义一个记录类,相当于手动编写了:
public final class Person implements Serializable {
private final String name;
private final int age;
private final String email;
public Person(String name, int age, String email) { … }
public String name() { return name; }
public int age() { return age; }
public String email() { return email; }
@Override public boolean equals(Object o) { … }
@Override public int hashCode() { … }
@Override public String toString() { … }
}
简洁度是记录类最大的卖点。
3. 性能对比
| 场景 | 手写 POJO | 记录类 |
|---|---|---|
| 代码量 | 高 | 极低 |
| 编译时间 | 无差别 | 略微降低(因为生成器工作) |
| 运行时 | 无差别 | 由于不可变,JVM 可以做更多优化 |
不可变性带来的安全性与 JIT 优化能力,通常在大规模并发系统中能显著提升吞吐量。
4. 适用场景
- 数据传输对象(DTO)
用于跨层或跨网络传输的数据结构。记录类天然适合,尤其在微服务架构中经常用到。 - 事件驱动系统
事件对象一般是不可变的,记录类能快速生成事件类。 - 函数式编程
结合 Java Stream API,记录类可以直接用作 lambda 参数。
5. 注意事项
- 不能继承:记录类是最终类,不能被子类继承,也不支持继承自非记录类。
- 字段不可为
var或non-static:所有字段必须是实例字段,不能使用static。 - 只能在接口/类中声明:不能作为方法返回值类型的匿名记录。
- 自定义方法:可以在记录体内添加
default方法,但不能添加字段。 - 与
@Getter等 Lombok 注解冲突:如果同时使用 Lombok,可能导致重复生成。
6. 记录类与普通 POJO 的对比代码
// POJO
public class Address {
private String street;
private String city;
private String zip;
public Address(String street, String city, String zip) {
this.street = street;
this.city = city;
this.zip = zip;
}
// getters, setters, equals, hashCode, toString
}
// 记录类
public record Address(String street, String city, String zip) {}
只需一行代码即可替代 100+ 行手写代码。
7. 未来展望
随着 Java 21 的持续迭代,记录类将继续得到完善,例如引入 非空 检查、支持 sealed 记录等。对于需要简洁、不可变数据结构的场景,记录类已经成为官方推荐的最佳实践。
结语
Java 17 的记录类不仅是语法糖,更是对 Java 数据模型的一次结构化改进。它让开发者可以在保持类型安全的同时,减少样板代码,提升代码可读性和可维护性。若你还在手动编写 DTO 或事件类,试着用记录类重写,感受一下“少写点代码,却能写得更安全、更清晰”的魅力。

发表回复