面向对象开发如何通过实战在构造函数中实施变量合法性校验?
- 内容介绍
- 相关推荐
本文共计765个文字,预计阅读时间需要4分钟。
构造函数是对象生成的第一道关卡,防御性编程在这里不是锦上添花,而是必须坚守的底线。实践不落俗套,非法参数可能导致对象内部逐渐崩溃,留下空指针、越界、业务逻辑断裂等隐患。
校验对象必须是参数,不是 this 字段
常见错误是写成 if (this.name == null) —— 这时 this.name 还没被赋值,永远为 null,校验形同虚设。真正要检查的是传入的形参 name。
- 正确写法:if (name == null) 或 Objects.requireNonNull(name, "name must not be null")
- 字符串额外加 isBlank() 避免空格占位的“假有效”值
- 数值类参数(如 age、count)需同步校验范围,例如 if (age 150)
校验必须在任何赋值和初始化之前完成
一旦执行了 this.patients = new ArrayList(),再抛异常,对象就处于“半初始化”状态:字段已部分写入,集合已分配但无人管理,资源泄漏风险陡增。
本文共计765个文字,预计阅读时间需要4分钟。
构造函数是对象生成的第一道关卡,防御性编程在这里不是锦上添花,而是必须坚守的底线。实践不落俗套,非法参数可能导致对象内部逐渐崩溃,留下空指针、越界、业务逻辑断裂等隐患。
校验对象必须是参数,不是 this 字段
常见错误是写成 if (this.name == null) —— 这时 this.name 还没被赋值,永远为 null,校验形同虚设。真正要检查的是传入的形参 name。
- 正确写法:if (name == null) 或 Objects.requireNonNull(name, "name must not be null")
- 字符串额外加 isBlank() 避免空格占位的“假有效”值
- 数值类参数(如 age、count)需同步校验范围,例如 if (age 150)
校验必须在任何赋值和初始化之前完成
一旦执行了 this.patients = new ArrayList(),再抛异常,对象就处于“半初始化”状态:字段已部分写入,集合已分配但无人管理,资源泄漏风险陡增。

