java record 是 java 14 引入、专为不可变数据载体设计的轻量级类,自动提供构造器、字段访问器(name()而非getname())、equals、hashcode和tostring,但禁止继承、字段可变或定义实例字段,仅支持组件声明顺序对应的单构造器及显式校验委托。

Java record 是 Java 14 引入(正式发布于 Java 14,JEP 359;Java 15 转为正式特性)、专为不可变数据载体设计的轻量级类。它自动为你生成构造器、字段访问器(getter)、equals、hashCode 和 toString 方法——但这些生成行为有明确规则和限制,不是“黑盒魔法”,理解其逻辑才能用得安心。
自动生成的构造器:仅一个,且参数顺序严格对应声明字段
record 声明中的每个组件(component)都会成为构造器的参数,按声明顺序一一对应。编译器不会生成无参构造器、也不会生成 setter 式的重载构造器。
例如:
record Person(String name, int age) {}等价于手动编写了如下构造器(语义上):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
this.name = name;
this.age = age;
}
- 不能省略任一参数,也不能调整顺序(否则编译报错)
- 可以显式定义构造器,但必须调用
this(...)委托给隐式构造器(或显式委托),且不能修改 final 字段 - 若需校验(如
age >= 0),应在显式构造器中完成,在调用this(...)前抛异常
自动生成的 getter:名称即字段名,无 get 前缀,返回值类型与字段一致
record 不生成传统 Bean 风格的 getName(),而是直接生成与组件同名的方法(即 name()、age()),返回对应字段值。
- 方法是 public、final、非静态,不可重写
- 如果组件名为
id,生成方法就是id(),不是getId() - 布尔类型组件如
active,生成的是active(),不是isActive()(这点与普通 class 的 JavaBean 规范不同)
equals、hashCode、toString:基于所有组件值的结构化实现
这三个方法默认按组件声明顺序,逐个比较/哈希/拼接,且**忽略字段的声明类型修饰符(如 private/public)和注解**,只看组件名和类型。
-
equals:先判 null 和类型,再依次调用各组件的equals(对基本类型用 ==) -
hashCode:使用 Objects.hash(component1, component2, ...) 计算,保证相等对象有相同哈希值 -
toString:格式固定为ClassName[component1=value1, component2=value2],例如Person[name=Tom, age=25] - 可显式重写任一方法,但一旦重写
equals,通常也应重写hashCode以保持契约
关键限制:record 天然不可变,不能继承,也不可被继承
record 类隐式是 final 的,所有字段是 final 的,且父类固定为 java.lang.Record(不可更改)。
- 不能
extends其他类(连extends Object都不允许) - 不能被其他类
extends(编译报错) - 不能定义实例初始化块、实例字段(除组件外)、或非 private 的实例方法(除非是 accessor 或重写的
equals等) - 可实现接口,也可定义 static 字段/方法,还可定义嵌套类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










