[JDK] 深度解析: Java 关键字(`record`) [JDK14-]
1 概述: Java 关键字: record
- Java 的
record关键字是在 Java 14 引入的预览特性,并在 Java 16 正式成为标准特性。
它提供了一种简洁的方式来声明不可变的数据载体类(Data Carrier Classes)。
核心作用
1. 自动生成样板代码
当你声明一个 record 时,Java 编译器会自动生成:
| 自动生成 | 说明 |
|---|---|
private final 字段 |
所有组件字段都是 final 的 |
| 构造方法 | 包含所有字段的构造方法 |
getter 方法 |
按字段名命名(如 name() 而非 getName()) |
equals() |
基于所有字段的比较 |
hashCode() |
基于所有字段生成 |
toString() |
包含类名和字段值的格式化字符串 |
2. 语法对比
- 传统类写法:
public final 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; }
// 还要手动写 equals, hashCode, toString...
}
- record 写法:
public record Person(
String name
, int age
) {}
主要特性
不可变性(Immutable)
var person = new Person("Alice", 30);
// person.name = "Bob"; // ❌ 编译错误,字段是 final 的
紧凑构造方法(Compact Constructor)
- 可以在不重复参数列表的情况下添加验证逻辑:
public record Person(String name, int age) {
public Person {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
// 不需要写 this.name = name; 编译器自动处理
}
}
可以实现接口,但不能继承类
public record Employee(String name, double salary)
implements Comparable<Employee>, Serializable {
// 可以实现接口方法
}
可以添加额外方法
public record Rectangle(double width, double height) {
public double area() {
return width * height;
}
public static Rectangle square(double side) {
return new Rectangle(side, side);
}
}
使用场景
| 场景 | 示例 |
|---|---|
| DTO(数据传输对象) | API 的请求/响应对象 |
| 数据库实体 | 简单的数据映射 |
| 配置类 | 读取的配置项 |
| 元组/多返回值 | 方法需要返回多个值 |
| 事件对象 | 领域事件 |
限制
- 不能继承其他类(隐式继承
java.lang.Record) - 不能声明实例字段(只能有静态字段)
- 默认是 final 的,不能被继承
- 组件是 final 的,创建后不能修改
实际示例
// 定义
public record Point(int x, int y) {}
// 使用
var p1 = new Point(10, 20);
var p2 = new Point(10, 20);
System.out.println(p1.x()); // 10 (getter 直接是字段名)
System.out.println(p1.equals(p2)); // true
System.out.println(p1); // Point[x=10, y=20]
// 解构(Java 16+ 模式匹配预览,Java 21 正式)
if (p1 instanceof Point(int x, int y)) {
System.out.println("x=" + x + ", y=" + y);
}
总结
record关键字的设计目的是减少样板代码,让开发者专注于数据本身的语义,而不是重复的 getter/setter/equals/hashCode/toString 等实现。它是 Java 向更简洁、更函数式编程风格演进的重要一步。
X 参考文献
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

浙公网安备 33010602011771号