在java构造函数中,应先对传入参数进行空值和有效性校验,再赋值给实例变量;若提前赋值再校验,会导致逻辑错误(如校验`this.healthprovider`而非参数本身),破坏防御性编程原则。
在面向对象编程中,构造函数承担着对象初始化与状态验证的双重职责。一个常见但易被忽视的陷阱是:将实例变量赋值语句置于前置条件检查之前。这不仅违背了“先验证、后赋值”的安全编程惯例,更可能引发逻辑错误甚至测试失败。
以 Provider 类为例,原始代码存在两个关键问题:
✅ 正确做法是:严格遵循“参数校验 → 字段赋值 → 辅助对象初始化”顺序。以下是推荐实现:
public Provider(String healthProvider) {
// Step 1: 校验传入参数(非 this.healthProvider!)
if (healthProvider == null) {
throw new IllegalArgumentException(PROVIDER_NU
LL);
}
if (healthProvider.isBlank()) {
throw new IllegalArgumentException(PROVIDER_ISBLANK);
}
// Step 2: 安全赋值实例字段
this.healthProvider = healthProvider;
// Step 3: 初始化依赖对象(如集合)
this.patients = new ArrayList<>();
}⚠️ 注意事项:
总结:构造函数是对象生命周期的“守门人”,前置条件校验必须精准、及时且原子。将校验置于任何字段赋值之前,既是代码健壮性的保障,也是JUnit等测试框架能稳定通过的根本前提。