最有效的条件校验是拆分逻辑、分层校验、提前拦截,用卫语句替代长布尔表达式,按数据合法性、业务规则、状态约束分离关注点并各自封装。

关键不是把条件写得更紧凑,而是让每一步判断都明确、可验证、不被绕过。最有效的做法是拆开逻辑、分层校验、提前拦截。
用卫语句(Guard Clauses)替代长串 && ||
把范围检查、空值校验、前置约束单独拎出来,一不满足就立刻返回或抛异常,不往后走。这样既避免运算符优先级干扰,也防止无效输入进入核心逻辑。
- 年份有效性检查放在最前:if (year 9999) return false;
- 再判断闰年规则本身:if (year % 400 == 0) return true;
- 接着排除被100整除但不被400整除的:if (year % 100 == 0) return false;
- 最后只留最简条件:return year % 4 == 0;
给每个子条件起有业务含义的变量名
别让 if 里塞一整行带括号的布尔式。把每部分意图显性化,比如:
- isInRange = year >= 1 && year
- divisibleBy4 = year % 4 == 0;
- divisibleBy100 = year % 100 == 0;
- divisibleBy400 = year % 400 == 0;
- 然后组合:if (isInRange && (divisibleBy400 || (divisibleBy4 && !divisibleBy100)))
变量名本身就是注释,调试时也能逐个打印验证,哪一环出问题一目了然。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
把高风险操作放在 && 右侧
利用 Java 的短路特性,确保可能抛异常或依赖前置条件的操作不会被误执行。
- 错误写法:obj != null && obj.getName().length() > 0 —— 如果 obj 为 null,getName() 仍会调用,NPE
- 正确写法:obj != null && obj.getName() != null && obj.getName().length() > 0
- 更稳妥:先提取变量,或用 Optional 封装
拒绝“一次性全塞进 if”的惯性思维
复杂条件往往对应多个独立关注点:数据合法性、业务规则、状态约束。它们不该揉在一个表达式里,而应按职责分离。
- 输入校验归校验(如年份范围、非空、格式)
- 规则计算归规则(如闰年公式、折扣阈值)
- 状态判断归状态(如订单是否已支付、用户是否已激活)
- 每类检查各自封装成方法,主流程只做协调

















