java record类自动提供字段同名的public accessor方法(如name())和全参构造方法,禁止覆写accessor、声明同名public方法或额外公有构造器,扩展行为需用紧凑构造或私有构造实现。

Java 的 record 类**不需要手动写 getter 和全参构造方法**——它们是自动、隐式生成的,这是 record 的核心设计目的。
自动生成的 getter 方法
record 中每个字段(即 record 声明中的参数)都会自动生成一个同名的 public、no-arg 的 accessor 方法(习惯叫 getter,但严格说是 accessor)。返回类型和参数名与字段完全一致,且不可被重写(编译器禁止覆写 record 的 accessor)。
- 例如:
record Person(String name, int age) {}会自动生成name()和age()方法(不是getName()或getAge()) - 调用方式:直接
person.name(),而非person.getName() - 不能声明同签名的 public 方法,否则编译报错
自动生成的全参构造方法
record 自动提供一个 public 的、参数顺序和类型与 record 声明完全一致的构造方法。你无需写 public Person(String name, int age) —— 它已存在。
- 该构造方法会对所有组件执行
Objects.requireNonNull(对引用类型),确保不可为 null(除非显式用String name前加final并配合注解绕过,但不推荐) - 可直接使用:
new Person("Alice", 30) - 不能定义其他公有构造方法(除非同时定义私有构造并委托给默认构造)
如果需要传统 getXXX() 风格?
record 不支持生成 getName() 这类方法。若项目强依赖 Bean 规范(如某些 JSON 库或框架反射要求),有两种常见应对方式:
- 改用普通 class + Lombok(
@Data或@Getter @AllArgsConstructor) - 保留 record,但搭配 Jackson 的配置(如
@JsonCreator+@JsonProperty)适配 accessor 名称 - 不建议在 record 内手动添加
public String getName() { return name; }—— 编译失败(重复方法)
想扩展行为?用紧凑构造或私有构造
record 允许定义紧凑构造(compact constructor),用于校验或规范化参数;也可定义私有构造并调用隐式全参构造(需显式 this(...))。
- 紧凑构造示例:
record Person(String name, int age) { Person { if (age - 私有构造需委托:
private Person(String name, int age) { this(name, Math.max(0, age)); } - 注意:所有构造路径最终必须到达隐式全参构造
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











