java布尔表达式需严格返回boolean类型,禁止非布尔值直接作条件;推荐常量前置避免空指针;多条件按开销和命中率排序;禁用副作用与不确定性操作;浮点比较应使用误差范围。

Java 分支结构的执行效率和可维护性,很大程度上取决于布尔表达式的写法。它不只是“能跑通”,更关系到 JIT 编译是否能识别热路径、代码是否易读易改、边界条件是否被遗漏。
布尔表达式必须是布尔类型结果
所有 if、while、for 的条件部分,最终都必须归结为 true 或 false。Java 不允许用非布尔值(如 int、String)直接作为条件,这点和 Python 或 JavaScript 不同。
- 正确写法:
if (score >= 60)、if (user != null && user.isActive()) - 错误写法:
if (score)(编译不通过)、if ("admin".equals(role))写成if (role.equals("admin"))(可能空指针) - 推荐用常量前置比较,比如
"POST".equals(method),避免 null 引发异常
多条件组合要按开销和命中率排序
当使用 && 或 || 连接多个子条件时,顺序直接影响性能和 JIT 优化效果。
- 把计算快、结果稳定的条件放左边:字段访问(
obj.status)、常量比较(type == TYPE_A) - 把耗时操作(如方法调用、IO、正则匹配)尽量靠右,或提取为局部变量
- 高频成立的条件优先:比如
status == ACTIVE占 92%,就该放在&&最左侧 - 避免写成嵌套形式:
if (req != null) { if (req.isSecure()) { ... } }→ 改为单层if (req != null && req.isSecure() && "POST".equals(req.getMethod()))
避免在布尔表达式中引入副作用或不确定性
布尔表达式应只做判断,不改变状态,也不依赖易变值。否则会干扰 JIT 热点识别,甚至引发逻辑错误。
- 不要在条件里调用修改状态的方法,例如
if (user.login() && user.hasRole("ADMIN")) - 避免直接使用
System.currentTimeMillis()或Math.random()等每次结果不同的表达式 - 若需时间判断,先存为局部变量:
long now = System.currentTimeMillis(); if (now > expireTime) - 浮点比较慎用
==,优先用误差范围判断,如Math.abs(a - b)
分支结构选型要匹配业务语义
不是所有多条件都该堆 if-else if。该用 switch 就别硬写 if 链,该用策略模式就别塞满分支。
- 离散值判断(int、enum、String 字面量)优先考虑
switch,尤其 Java 14+ 的增强版支持 yield 和箭头语法 - 范围判断(如成绩分段、金额区间)适合 if-else if,注意区间互斥与覆盖完整(别漏掉
else) - 权限、状态机等复杂逻辑,建议抽出独立方法或用枚举 + 方法引用,让主干分支保持简洁
- 永远检查 null 和边界值:比如
list != null && !list.isEmpty(),别省略前者
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











