用boolean标志位配合&&优化多重前置条件校验,核心是让检查失败即终止的逻辑自然流动;需具名化每层条件、避免长链调用、将高危操作置于&&右侧、警惕副作用与默认值陷阱,并封装复杂逻辑为独立方法。

用 boolean 标志位配合 && 优化多重前置条件校验,核心是让“检查失败即终止”的逻辑自然流动,不靠嵌套 if,也不靠硬编码开关。关键不在压缩代码行数,而在让每一步检查都成为下一次执行的“准入许可”。
把每个条件变成可读、可复用的布尔表达式
不要写 user != null && user.getProfile() != null && user.getProfile().getAvatar() != null && ... 这类长链。应先具名化:
boolean hasUser = user != null;boolean hasProfile = hasUser && user.getProfile() != null;boolean hasAvatar = hasProfile && user.getProfile().getAvatar() != null;
这样每一层含义清晰,调试时能快速定位哪一环断开;也方便后续抽成 isUserReady() 方法,而不是堆砌符号。
用 && 把检查和操作安全串联
当某个操作(如调用方法、访问属性)有潜在风险时,把它放在 && 右侧,左侧放它的前提条件:
-
hasUser && user.isActive()—— 若user为 null,isActive()绝对不执行 -
hasUser && !user.isLocked() && user.hasPermission("EDIT")—— 前置条件逐级收紧,任一为 false 就停在当前步 - 避免
user != null & user.getName().length() > 0:& 不短路,null 时仍会触发getName(),直接报错
注意副作用与默认值的边界
&& 只控制执行时机,不改变语义。以下情况需特别留心:
- 右侧不能有必须执行的副作用(如记录日志、更新计数器),否则可能被跳过
- 需要两个校验都运行(比如收集全部错误),就别用
checkA() && checkB(),而应分开调用再组合结果 - 提供默认值用
config.timeout || 5000简洁,但注意0、""、false都会被覆盖——若业务允许 0 作为合法值,就得改用显式判断
优先封装复杂逻辑,而非延长 && 链
当条件超过三重,或涉及业务规则(如“用户是 VIP 且订单未超时且库存充足”),应封装为独立方法:
if (canFulfillOrder(user, order)) { ... }- 方法体内仍可用 && 实现安全链式检查,但对外接口干净,测试也容易覆盖各种组合
- 避免
user.isVip() && order.getCreatedAt().isAfter(Instant.now().minusDays(7)) && stock > 0直接出现在业务主流程中










