java封装校验要求setter中先检查后赋值,用illegalargumentexception等非检查异常快速失败;字符串需判空、去空格、验长度,数值需验边界,枚举需校验合法值;禁止静默修正,确保对象状态一致性。

Java 封装在属性校验中通过异常机制拦截非法赋值,核心是:在 setter 方法内**先校验、再赋值**,不满足条件就立即抛出运行时异常(如 IllegalArgumentException),从而阻止对象状态被污染。
校验必须放在赋值之前
这是封装安全性的底线。一旦非法值写入字段,对象就处于不一致状态,即使后续抛异常也无法自动回滚。
- ✅ 正确顺序:检查条件 → 合法才执行
this.field = value; - ❌ 错误顺序:先赋值 → 再判断 → 抛异常(此时字段已变,违反封装)
选对异常类型,不强制调用方处理
业务校验应使用非检查异常(RuntimeException 子类),避免把校验责任推给调用方。
- IllegalArgumentException:最常用,适用于参数明显不合逻辑(如年龄为 -5、邮箱格式错误)
-
NullPointerException:当字段明确不允许为
null,且传入null时可直接抛出 - 自定义异常(如
InvalidEmailException):仅当需要上层差异化捕获并响应时才建,比如统一返回 HTTP 400 并带字段名提示
常见字段的校验写法示例
兼顾空值、空白、长度、数值边界等典型问题,保持逻辑清晰、不遗漏关键点。
-
字符串字段:先判
null,再trim(),再判空,最后校验长度if (name == null || name.trim().isEmpty()) { throw new IllegalArgumentException("姓名不能为空"); }<br> if (name.length() > 50) { throw new IllegalArgumentException("姓名长度不能超过 50 字符"); }<br> this.name = name.trim(); -
数值字段:注意边界闭合与语义合理(如年龄 0~150,金额 ≥ 0)
if (age 150) { throw new IllegalArgumentException("年龄必须在 0~150 之间"); }<br> this.age = age; -
枚举或状态字段:用
Objects.requireNonNull防null,再校验是否在允许集合内if (status == null || !Set.of("ACTIVE", "INACTIVE").contains(status)) { throw new IllegalArgumentException("状态值不合法"); }
不推荐在校验中做“静默修正”
例如把 null 自动转成空字符串、把超长名自动截断——这会让调用方误以为输入被接受,掩盖真实问题,违背快速失败原则。
- 校验的目的不是容错,而是明确拒绝非法输入
- 真正需要默认值的场景,应在更高层(如 Controller 或 Service)显式提供,而非在 setter 中隐藏逻辑
- getter/setter 是对象内部契约,不应承担数据清洗或转换职责
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











