卫语句应优先用于校验类逻辑:参数为空、状态非法、权限不足、前置资源不可用、业务规则不成立,将“不满足条件就退出”检查前置,使主逻辑保持零缩进、线性可读。

用卫语句重构深层 if 分支,核心是把“不满足条件就退出”的检查提到最前面,让主逻辑保持在方法体顶层、缩进为 0。这不是为了少写 else,而是让代码读起来像一条直线:先拦住所有不该进来的,剩下的自然就是该干正事的。
哪些情况适合改成卫语句
以下校验类逻辑,基本都该优先用卫语句处理:
- 参数为空(user == null、order == null)
- 状态非法(!user.isActive()、order.getStatus() != OPEN)
- 权限不足(!user.hasRole("ADMIN"))
- 前置资源不可用(!cacheService.isAvailable())
- 业务规则不成立(item.getStock() )
怎么写才算合格的卫语句
每条卫语句要干净、独立、意图明确:
- 只判断一个明确的拒绝理由,不拼接多个条件(比如不要写 if (user == null || order == null),而要拆成两条)
- 触发后立即 return 或 throw,不执行后续任何逻辑
- 不包含业务处理代码,只做“守门”动作
- 按失败概率从高到低排列:null 检查放最前,数据库查询类检查放后面
对比重构前后效果
重构前(4 层嵌套,主逻辑缩进 4 级):
if (user != null) {
if (user.isActive()) {
if (order != null && order.getStatus() == OPEN) {
if (inventoryService.hasStock(order.getItemId(), order.getQuantity())) {
// 主流程
}
}
}
}
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
重构后(0 层嵌套,主逻辑裸露在顶层):
if (user == null) throw new IllegalArgumentException("用户不能为空");
if (!user.isActive()) throw new IllegalStateException("用户未激活");
if (order == null) throw new IllegalArgumentException("订单不能为空");
if (order.getStatus() != OPEN) throw new IllegalStateException("订单状态非法");
if (!inventoryService.hasStock(order.getItemId(), order.getQuantity()))
throw new BusinessException("库存不足");
// ✅ 主流程直接开始,无缩进
循环里的卫语句也一样有效
遍历集合时,同样适用“先拦后干”原则:
- 把 continue 当作循环内的卫语句出口
- 空值、无效状态、跳过条件都放在 for 循环体第一行
- 主处理逻辑保持左对齐,一眼可见
例如:for (User user : users) {
if (user == null || !user.isActive()) continue;
// 处理有效用户
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










