Java Record 详解
Java Record 是 Java 14 引入的预览特性,在 Java 16 中正式成为标准特性。它是一种特殊类型的类,专门用于表示不可变的数据载体,旨在简化数据模型的创建。
Record 的核心特性
-
不可变性:Record 的所有字段都是
final的,一旦创建就不能修改 -
自动生成方法:编译器自动生成:
-
规范构造方法(包含所有组件)
-
访问器方法(字段名直接作为方法名)
-
equals()和hashCode()方法 -
toString()方法
-
-
简洁语法:大大减少样板代码
基本语法
public record RecordName(type1 component1, type2 component2, ...) {// 可选:自定义方法、静态字段等
}
示例:基本 Record
public record Person(String name, int age, String email) {}
这个简单的 Record 声明相当于以下传统类:
public final class Person {private final String name;private final int age;private final String email;public Person(String name, int age, String email) {this.name = name;this.age = age;this.email = email;}public String name() { return name; }public int age() { return age; }public String email() { return email; }@Overridepublic boolean equals(Object o) { /* 基于所有字段的equals实现 */ }@Overridepublic int hashCode() { /* 基于所有字段的hashCode实现 */ }@Overridepublic String toString() { /* 包含所有字段的字符串表示 */ }
}
使用 Record
public class RecordExample {public static void main(String[] args) {// 创建Record实例Person person = new Person("张三", 30, "zhangsan@example.com");// 访问字段(注意:方法名与字段名相同)System.out.println("姓名: " + person.name());System.out.println("年龄: " + person.age());System.out.println("邮箱: " + person.email());// 自动生成的toString()System.out.println(person); // 输出: Person[name=张三, age=30, email=zhangsan@example.com]// 自动生成的equals()和hashCode()Person samePerson = new Person("张三", 30, "zhangsan@example.com");System.out.println("是否相同: " + person.equals(samePerson)); // true}
}
自定义 Record
虽然 Record 自动生成方法,但你也可以自定义:
public record Person(String name, int age, String email) {// 自定义构造方法(紧凑形式)public Person {if (age < 0) {throw new IllegalArgumentException("年龄不能为负数");}// 不需要显式赋值,编译器会自动处理}// 自定义方法public String greeting() {return "你好,我是" + name + ",今年" + age + "岁";}// 静态方法public static Person createDefault() {return new Person("无名氏", 0, "无邮箱");}
}
Record 的限制
-
不能继承其他类(除了隐式继承
java.lang.Record) -
不能声明非静态字段
-
所有字段都是
final的 -
不能声明为
abstract -
不能扩展其他 Record
何时使用 Record
Record 最适合用于:
-
数据传输对象(DTO)
-
值对象(Value Objects)
-
方法返回多个值
-
临时数据容器
-
任何需要简单、不可变数据结构的场景
Record 与传统类的对比
| 特性 | Record | 传统类 |
|---|---|---|
| 不可变性 | 强制 | 可选 |
| 样板代码 | 自动生成 | 手动编写 |
| 继承 | 不能继承其他类 | 可以继承 |
| 字段 | 所有字段都是 final | 字段可变性可选 |
| 构造方法 | 自动生成 | 手动编写 |
| toString/equals/hashCode | 自动生成 | 手动编写 |
总结
Java Record 提供了一种简洁、安全的方式来表示不可变数据。它通过自动生成常用方法显著减少了样板代码,同时通过强制不可变性确保了数据安全。对于简单的数据载体类,Record 是比传统类更优雅的选择。
