Java多条件判断应按逻辑类型选结构:互斥范围用if-else if-else(命中即停),等值枚举优先switch(JDK14+支持多值合并),非互斥组合拆布尔变量;按执行成本分三层校验,轻量前置、重量后置;避免硬写||链,推荐Set.contains或switch表达式;注意字符串判空、括号明确优先级、复杂条件封装方法。

Java 分支语句处理多条件判断,关键不是堆砌 if,而是按逻辑类型选结构、按执行成本分层级、按可读性做封装。
按条件关系选主干结构
互斥范围判断(如分数定等级、年龄分段)用 if-else if-else:从高到低写,命中即停,不继续判断后续分支。
等值枚举判断(如订单状态、角色类型)优先用 switch,JDK 14+ 支持多值合并:case "PAID", "SHIPPED" -> doAction();
非互斥或需组合逻辑(如权限叠加校验)适合拆成独立布尔变量再组合:boolean hasAuth = checkRole() && checkScope(); boolean isExpired = token.isExpired(); if (hasAuth && !isExpired) { ... }
按执行代价分三层校验
避免所有条件一股脑塞进一个 if 里:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
轻量级放最前:非空、格式、长度等内存内快速判断。例如
StringUtils.isBlank(phone)、password.length() >= 8 -
中量级居中:业务规则类判断,不查库也不远程调用。例如
order.getStatus() == OrderStatus.SUBMITTED、coupon.isValidNow() -
重量级放最后:DB 查询、RPC 调用等高开销操作。例如
userMapper.selectByPhone(phone) != null、riskService.check(userId)。前置拦截失败后,这类调用就省了
“或”条件别硬写 || 链
像“角色是 admin 或 editor 或 moderator”,别写:role.equals("admin") || role.equals("editor") || role.equals("moderator")
容易漏值、不防 null、难扩展。推荐两种方式:
立即学习“Java免费学习笔记(深入)”;
- 用不可变 Set:
Set.of("admin", "editor", "moderator").contains(role) - JDK 14+ 用 switch 表达式:
switch (role) { case "admin", "editor", "moderator" -> true; default -> false; }
细节不注意,小 bug 处处有
字符串判空统一用 "expected".equals(str),不写 str.equals("expected"),防 NPE。
多个逻辑运算符混用时加括号明确意图,比如 (type == 1 && status > 0) || (type == 2 && flag),不依赖默认优先级。
重复出现的复杂条件建议抽成私有方法,比如 isValidLoginRequest(dto),让主流程只看意图,不看实现。

















