德·摩根定律是java中简化否定逻辑的核心规则:!(a&&b)→!a||!b,!(a||b)→!a&&!b;应用时需先括号整体取反,再逐层转换,配合语义变量提升可读性,并注意空安全顺序。

德·摩根定律不是数学考试题,是 Java 里写 if 时最常踩坑的逻辑盲区。它不改变结果,但能把你从嵌套否定、括号迷宫和“这到底在拒绝谁”的困惑中拉出来。
把 ! 拉到最外层再拆解
遇到带多个 && 或 || 的否定条件,别急着逐个加 !,先用括号框住整个子表达式,再整体取反——这是应用德·摩根的前提。
- 错误写法:
if (!user.isValid() || !user.isActive() || user.isBanned())→ 语义散乱,难看出这是“访问被拒”的统一条件 - 正确起点:
if (!(user.isValid() && user.isActive() && !user.isBanned()))→ 明确表达“不满足全部准入条件” - 再按定律展开:
!user.isValid() || !user.isActive() || user.isBanned()(注意:这里!(!user.isBanned())变成user.isBanned())
&& 变 ||,|| 变 &&,每个子项都取反
两条核心规则必须记牢,且顺序不能错:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
!(A && B)→!A || !B(“并非两者都成立” = “至少一个不成立”) -
!(A || B)→!A && !B(“并非至少一个成立” = “两个都不成立”) - 多层也适用:
!(A && (B || C))→!A || (!B && !C),先对外层 && 拆,再对内层 || 拆
用语义变量代替裸表达式
定律化简后,别直接塞进 if 里。把结果赋给有业务含义的布尔变量,可读性立刻翻倍:
- 原式:
if (!(user.isAuthenticated && (user.role == "admin" || user.role == "moderator"))) - 化简后:
boolean lacksAuthOrRole = !user.isAuthenticated || (user.role != "admin" && user.role != "moderator"); - 最终:
if (lacksAuthOrRole) { ... }—— 条件名本身就在说话
警惕短路与空安全的隐性冲突
德·摩根本身不处理空指针,但它会暴露你原来靠短路隐藏的问题:
- 原来安全:
if (obj != null && obj.isActive())—— obj 为 null 时,isActive()不执行 - 否定后若顺序错:
if (!obj.isActive() || obj == null)→!obj.isActive()先执行,NPE 立刻发生 - 正确否定顺序:
if (obj == null || !obj.isActive()),或更推荐:if (!Objects.nonNull(obj) || !obj.isActive())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










