一、什么是 Java Record?
Java Record 是一种特殊的类,于 Java 14 中作为预览特性引入,并在 Java 16 中正式发布。它们简化了不可变数据载体的创建。Record 的设计目的是以简洁且易读的方式保存数据,并且消除了传统类(如 DTO)所需的大部分样板代码。
在传统的 DTO 中,你需要手动编写构造函数、getter、equals()、hashCode() 和 toString() 方法(正如我们之前所做的)。而使用 Record,Java 会自动为你生成所有这些内容。这使得它们非常适合那些主要任务是携带数据的简单、不可变对象。
二、Java Record 的关键特性
如下是Java Record的关键特性
- 默认不可变:一旦创建了 Record,你就无法更改其数据(与通常可变的 DTO 不同)。
- 简洁的语法:你声明字段后,Java 会自动生成构造函数、getter、equals()、hashCode() 和 toString()。
- 没有 setter:由于 Record 是不可变的,因此它们不提供 setter。
让我们创建一个 UserRecord,它与我们之前创建的 UserDTO 保存相同的数据,但使用 Record:
public record UserRecord(String name, int age, String email) {
}
仅此而已!Java 会自动生成:
- 一个 构造函数:new UserRecord(String name, int age, String email)
- Getter,针对每个字段:name()、age() 和 email()
- 一个 equals() 方法,用于比较两个 UserRecord 对象。
- 一个 hashCode() 方法,用于生成唯一的哈希码。
- 一个 toString() 方法,返回类似这样的字符串表示:UserRecord[name=xxx, age=25, email=xxx@example.com]
以下是如何使用 UserRecord:
public class UserRecordUsageExample {
public static void main(String[] args) {
UserRecord user = new UserRecord("xxx", 25, "xxx@example.com");
// 访问数据
System.out.println(user.name());
System.out.println(user.age());
System.out.println(user.email());
// 使用 toString() 方法
System.out.println(user);
// 比较记录
UserRecord anotherUser = new UserRecord("yyy", 22, "yyy@example.com");
System.out.println(user.equals(anotherUser));
}
}
使用 UserRecord,我们避免了手动编写 getter、构造函数、equals()、hashCode() 和 toString()。Java Record 提供了一种简洁、清晰的方式来创建仅用于携带数据的不可变对象。
为什么要使用 Record?
- 减少样板代码:你无需编写重复的代码,如 getter 或 equals() 方法。
- 默认不可变:确保数据在对象创建后无法更改,使其在多线程环境中更加安全。
- 明确意图:使用 Record 明确表明该对象仅用于携带数据,而没有额外的行为或逻辑。