Java 记录类(record)
记录类(record)是 Java 14 引入的预览特性,在 Java 16 中正式发布。记录类用于创建不可变的数据对象,简化了 POJO 的编写。本章将详细介绍 Java 中的记录类。
record 定义与语法
什么是记录类
**记录类(record)**是一种特殊的类,用于表示不可变的数据对象。
特点:
- 自动生成构造函数、getter、equals、hashCode、toString
- 不可变(所有字段都是 final)
- 简洁的语法
基本语法
// 传统 POJO
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
// 使用 record(简洁)
public record Person(String name, int age) {
}
record 的组成部分
public record Person(String name, int age) {
// 1. 记录头:定义组件(components)
// 2. 记录体:可以添加方法、构造函数等
}
不可变数据对象
不可变性
记录类的所有字段都是 final 的,创建后不能修改。
public record Point(int x, int y) {
}
// 使用
Point p = new Point(10, 20);
// p.x = 30; // 编译错误:不能修改
// 创建新对象
Point p2 = new Point(30, 40);
自动生成的方法
记录类自动生成以下方法:
public record Person(String name, int age) {
}
Person person = new Person("张三", 25);
// 1. 构造函数
Person p = new Person("张三", 25);
// 2. 访问器方法(不是 getter,直接使用字段名)
String name = person.name(); // 不是 getName()
int age = person.age(); // 不是 getAge()
// 3. equals
Person p1 = new Person("张三", 25);
Person p2 = new Person("张三", 25);
boolean equal = p1.equals(p2); // true
// 4. hashCode
int hash = person.hashCode();
// 5. toString
String str = person.toString();
// 结果:"Person[name=张三, age=25]"
示例:简化 POJO
示例 1:基本记录类
public record Student(String name, int age, String major) {
}
// 使用
Student student = new Student("张三", 20, "计算机科学");
System.out.println(student.name()); // "张三"
System.out.println(student.age()); // 20
System.out.println(student.major()); // "计算机科学"
System.out.println(student); // "Student[name=张三, age=20, major=计算机科学]"