switch在状态机中仅作轻量分发器:匹配枚举事件/状态、委托处理、校验合法性、映射语义;不承担动态条件判断、持久化或复杂流程,避免替代完整状态机框架。

在复杂业务状态机中,switch 分支不直接驱动状态流转,而是作为“状态分发器”和“事件处理器”的轻量支撑工具。它适合在明确、有限、静态的状态或事件枚举上做精准匹配,把控制权快速交给对应的状态类或处理逻辑,避免用 if-else 堆砌判断链。
用 switch 匹配事件类型,委托给当前状态处理
每个具体状态类(如 PaidState)内部,用 switch 处理该状态下允许响应的事件,保持行为内聚:
- 只匹配本状态关心的事件,比如已支付状态只处理
SHIP、CANCEL,忽略PAY - 每个 case 尽量只做一件事:校验 + 调用业务方法 + 触发状态变更(如
context.changeState(new ShippedState())) - 不写复杂流程,不嵌套分支;复杂逻辑抽成独立方法,如
validateInventory()、notifyLogistics()
用 switch 配合枚举定义状态迁移合法性
在状态变更入口(如 Context.changeState())中,用 switch 查预置的迁移规则表,拦截非法跳转:
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
- 以当前状态为维度,switch 匹配后,返回允许的目标状态集合
- 例如:
switch (currentState) { case PAID: return Set.of(SHIPPED, CANCELLED); case SHIPPED: return Set.of(DELIVERED, RETURNED); } - 目标状态不在集合中,直接抛
IllegalStateException,不执行变更
用 switch 表达式统一状态语义输出
对外暴露状态含义时(如日志、API 响应),用 Java 14+ 的 switch 表达式,简洁安全地映射枚举到描述或行为:
- 必须覆盖所有枚举值,或显式写
default -> throw,防止遗漏新状态导致静默错误 - 示例:
String desc = switch (status) { case CREATED -> "已创建"; case PAID -> "已支付"; case SHIPPED -> "已发货"; default -> throw new IllegalStateException("未知订单状态: " + status); }; - 可直接赋值、返回,避免临时变量和 if 层叠
避免把 switch 当状态机主干来用
switch 本身不具备状态记忆、转换条件表达式、并发保护等能力。以下情况不该依赖它:
- 需要根据金额、角色、时间等动态条件决定下一步(该用事件驱动状态机,如 Spring StateMachine)
- 状态变更需原子更新数据库字段(该用带版本号的 update where version = ?)
- 多个状态共享相似逻辑但有细微差异(该用模板方法 + 钩子,而非在每个 case 里重复写 if)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










