Java 14 的 record 是专为不可变数据载体设计的轻量级类,自动将字段声明为 private final 并生成同名 getter,隐式构造器强制初始化且禁止外部修改,支持自定义构造器委托校验。

Java 14 引入的 record 是专为不可变数据载体设计的轻量级类,它天然支持封装,大幅简化了传统 POJO 的样板代码。
自动封装:字段私有 + 公共访问器
record 默认将所有组件字段声明为 private final,并自动生成公共的、与字段同名的 getter 方法(无 get 前缀),无需手动编写。这符合封装原则——内部状态不可修改,对外只提供安全读取接口。
例如:
record Person(String name, int age) {}等价于手动编写一个包含私有 final 字段、构造器、getter、equals/hashCode/toString 的类,但只需一行。
立即学习“Java免费学习笔记(深入)”;
构造过程即初始化:禁止外部篡改
record 的构造器由编译器隐式生成,且强制要求所有组件在创建时赋值。你无法定义无参构造器,也不能在构造后修改字段——final 语义和无 setter 保证了实例一旦构建就完全不可变。
你可以自定义构造器做参数校验,但必须委托给隐式构造器:
record Person(String name, int age) {public Person {
if (name == null || name.isBlank()) throw new IllegalArgumentException("Name required");
if (age }
}
透明的数据契约:组件名即公共 API
record 的组件名(如 name、age)直接成为其逻辑上的公共属性名。编译器生成的 accessor 方法(name()、age())就是稳定、不可绕过的访问入口。这种“命名即契约”的设计让封装意图清晰,调用方无需猜测字段是否可读或是否被重命名。
它不提供 setter、不支持继承(final 类)、不鼓励添加可变状态——这些限制不是缺陷,而是对不可变数据载体这一职责的精准表达。
配套行为保持封装边界
你可以在 record 中添加静态方法、实例方法甚至嵌套类型,但应避免引入可变字段或破坏不可变性。例如添加格式化方法是安全的:
public String formalName() { return name().toUpperCase(); }
public static Person of(String n, int a) { return new Person(n, a); }
}
这类方法不暴露内部表示,也不改变状态,反而强化了封装下的职责内聚。


















