Java记录类可通过重写紧凑构造方法实现参数校验,需在this(...)调用前执行校验逻辑并抛出IllegalArgumentException等运行时异常,严禁对final组件赋值或遗漏this(...)调用。

Java记录类(record)的紧凑构造方法默认不支持参数校验,但可以通过显式定义构造方法并调用私有全参构造器来实现校验逻辑。
理解记录类的构造方法机制
记录类自动生成一个公共的紧凑构造方法(canonical constructor),它会将参数直接传递给隐式声明的私有全参构造器。这个紧凑构造方法不可直接修改,但可以**显式重写**它——此时编译器不再生成默认版本,而是使用你写的版本,并要求你在其中调用 this(...) 转发到私有全参构造器。
重写紧凑构造方法并添加校验
在 record 中定义一个与记录组件签名一致的公共构造方法,内部执行校验后调用 this(...):
- 校验逻辑必须放在 this(...) 调用之前
- 不能在构造方法体中对组件字段赋值(record 组件是 final 的,且由底层构造器完成初始化)
- 抛出异常(如 IllegalArgumentException)可中断对象创建
示例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
public Person {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Name cannot be null or blank");
}
if (age 150) {
throw new IllegalArgumentException("Age must be between 0 and 150");
}
}
避免常见错误
- 不要尝试在紧凑构造方法中写 this.name = ... —— record 组件不可赋值,编译报错
- 不要遗漏 this(...) 调用 —— 编译器会提示“implicit call to super() is not allowed”
- 不要在构造方法中调用 super(...) —— record 没有显式父类,且继承自 java.lang.Record,其构造器不可直接调用
- 校验失败时建议使用运行时异常(如 IllegalArgumentException),符合 record 不可变、声明即约束的设计意图
进阶:结合模式匹配与校验复用
若需统一校验逻辑(例如多个 record 共享非空检查),可提取为静态工具方法:
private static void requireNonBlank(String s, String name) {if (s == null || s.trim().isEmpty()) {
throw new IllegalArgumentException(name + " cannot be null or blank");
}
}
然后在紧凑构造方法中调用:
public Person {
requireNonBlank(name, "Name");
if (age }
重写紧凑构造方法是 record 实现业务约束最直接的方式,既保持语法简洁,又不失校验能力。关键在于理解其转发机制,并把校验放在 this(...) 前。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










