核心是用卫语句提前拦截异常路径,保持主干逻辑裸露;按类型分发抽成策略结构;拆分方法各司其职;善用三元与optional简化单层判断。

核心思路是把“异常路径提前拦截、主干逻辑保持裸露”,而不是让正常流程被层层 if 包裹。嵌套超过三层就该警惕,它不是语法错误,而是设计信号——逻辑职责没切分清楚。
用卫语句替代深层校验
遇到空值、非法状态、权限不足等边界情况,立刻返回或抛异常,不进主逻辑。每个卫语句只做一件事,比如只判 null,只判过期,不拼条件也不写业务。
- 改前:if (obj != null) { if (obj.isValid()) { if (user.hasRole()) { /* 主流程 */ } else { ... } } else { ... } } else { ... }
- 改后:if (obj == null) throw new IllegalArgumentException("对象为空");
if (!obj.isValid()) throw new IllegalStateException("对象无效");
if (!user.hasRole()) throw new AccessDeniedException("权限不足");
// 主流程直接写在这里,缩进为 0
把类型分发抽成独立结构
当 if-else 是根据类型(如枚举值、字符串标识)做不同处理,别堆在方法里硬写分支。用策略模式、工厂 + Map 或 switch 表达式替代。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 避免:if (type == TYPE_LINK) { ... } else if (type == TYPE_IMAGE) { ... }
- 推荐:Map
> handlers = Map.of( TYPE_LINK, () -> doShareLink(...), TYPE_IMAGE, () -> doShareImage(...) );
handlers.getOrDefault(type, () -> { throw new UnsupportedOperationException(); }).get();
拆方法,让每层只做一层事
一个方法里既有校验、又有查库、又有组装、还有回调,必然嵌套。按职责切成小方法:validateInput()、loadData()、buildResult()、notifyUser()。原方法只剩几行调用,清晰且易测。
- 原来 200 行含 5 层 if 的 share() 方法
- 拆成 validateShareItem(item);
data = fetchRelatedData(item);
result = assembleResponse(data);
callback.onSuccess(result);
善用三元与 Optional 简化单层判断
对简单二选一赋值或返回,三元运算符比 if-else 更紧凑;对可能为空的对象链操作,用 Optional 避免连续 null 判断。
- 代替:if (str != null) return str.trim(); else return "";
写成:return Optional.ofNullable(str).map(String::trim).orElse(""); - 代替:String name = user != null ? (user.getProfile() != null ? user.getProfile().getName() : "") : "";
写成:String name = Optional.ofNullable(user)
.map(User::getProfile)
.map(Profile::getName)
.orElse("");
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










