用枚举定义物流状态并配合switch分发是最轻量可控的方式:1. 用强类型枚举明确七个不可扩展状态;2. switch只列裸常量,入参必须为枚举类型且校验非空;3. 每个case仅调度独立方法,不实现业务逻辑;4. 禁用default,未覆盖状态编译失败或抛AssertionError。

用枚举定义物流状态、配合 switch 分支做状态分发,是轻量级项目中最直接又最可控的方式。关键不是写得快,而是改得稳、漏不得、读得清。
用强类型枚举明确状态边界
先定义一个不可扩展的物流状态枚举,比如:
- CREATED:订单创建,未揽收
- PICKED_UP:已揽件,进入中转
- IN_TRANSIT:运输途中(含分拨、干线)
- OUT_FOR_DELIVERY:派件中
- DELIVERED:已签收
- RETURNED:已退回
- CANCELLED:已取消
所有状态必须显式列出,不靠 int 或 String 模拟;Java 中确保 enum 是 public,C++ 推荐用 enum class,Kotlin 用 enum class + when 表达式。这样编译器才能识别“总共就这七个值”,为后续穷尽检查打基础。
switch 分支只列枚举常量,不带类名
在 Java 或 Kotlin 中,直接写 case PICKED_UP:,别写 case LogisticsStatus.PICKED_UP:。后者冗余且易因重构漏改——一旦枚举类改名或挪包,所有带类名的 case 都会报错;而裸常量由 IDE 自动补全,语义更干净。
同时,switch 入参必须是 LogisticsStatus 类型本身,禁止传 String statusStr 然后 valueOf 转换后再 switch——反序列化失败或空值会导致 NPE,应在进入 switch 前校验非 null 并捕获 IllegalArgumentException。
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
每个 case 只调度,不实现业务逻辑
把发通知、调接口、更新 DB 这些动作全部抽成独立方法,case 内只做三件事:
- 调用前置校验(如 onEnterOutForDelivery() 检查是否已有运单号)
- 执行核心动作(如 updateDeliveryStatus() 更新数据库字段)
- 判断是否满足跳转条件(如 shouldTransitionToDelivered() 根据签收时间戳和时效规则返回布尔)
主 switch 最后一句可以是 if (shouldTransitionToDelivered()) current = DELIVERED; break; ——状态流转控制权仍在主干,不藏在子函数里。
禁用 default,让遗漏无处隐藏
Java 14+ 推荐用 switch 表达式(→ 语法),不写完全部七个 case 直接编译失败;旧版本则在 default 中抛 AssertionError("Unexpected status: " + status),而不是 return null 或静默跳过。前者一运行就崩,倒逼补全;后者埋下静默故障,上线后才发现某状态没响应短信。
如果真有预留状态(如 RESERVED),显式写出 case RESERVED: /* intentionally unused */ break;,比藏在 default 里更清晰可维护。

















