优先用switch处理等值判断,策略模式适用于复杂逻辑或动态规则;switch表达式用→更安全简洁,但仅限编译期常量;范围判断、布尔组合等仍需if。

多重 if 分支本质上是处理多个互斥条件的逻辑,但容易变得冗长、难维护、易出错。用 switch 或策略模式替代,核心在于**识别条件特征**:如果是等值判断(如状态码、枚举、固定字符串),优先用 switch;如果每个分支逻辑复杂、可变、或涉及对象行为差异,则策略模式更合适。
能直接用 switch 替代的情况
适用于单一变量的离散值等值匹配,且所有分支基于同一表达式。
- 类型必须是编译期常量:enum、String、int、byte、short、char,或其包装类(JDK 7+ 支持 String,JDK 14+ 推荐用 switch 表达式)
- case 值不能是变量或方法调用,例如 case STATUS_OK ✅,case getStatus() ❌
- 必须覆盖所有可能取值,或提供 default,否则编译失败(尤其 enum 类型会强制检查)
- 避免在 -> 右侧写多行逻辑:比如初始化对象、调用多个 service 方法——这种场景建议退回传统 switch 语句块,或转向策略模式
switch 表达式怎么写更安全简洁
用箭头语法(->)替代冒号 + break,自动终止、支持返回值、无 fall-through 风险。
动态切换AI模型以优化成本与性能。当用户发出“eco mode”、“balanced mode”、“smart mode”或“max mode”等模式指令,或使用“/modes status”查询状态及“/modes setup”配置模式时触发。
- 字符串匹配示例:
String desc = switch (status) {
case "CREATED", "SUBMITTED" -> "待处理";
case "APPROVED" -> "已通过";
case "REJECTED", "CANCELED" -> "已终止";
default -> "未知状态";
}; - 枚举更推荐:IDE 可补全、编译器报遗漏、null 需单独判(switch 本身不处理 null):
if (orderType == null) return "类型未定义";
return switch (orderType) {
case ONLINE -> "线上订单";
case OFFLINE -> "线下订单";
case RETURN -> "退货单";
};
该上策略模式的信号
当 if 分支里不只是返回一个字符串,而是执行一整套操作(查库、发消息、更新状态、调用多个服务),或者条件组合复杂(type == A && flag)、规则需要动态配置、后续可能新增类型时,策略模式就是更自然的选择。
- 定义统一接口,如 OrderHandler,含
handle(Order order) - 为每种订单类型实现具体策略:
OnlineOrderHandler、ReturnOrderHandler等 - 用工厂或 Map 注册映射关系:
MaphandlerMap = Map.of(
OrderType.ONLINE, new OnlineOrderHandler(),
OrderType.RETURN, new ReturnOrderHandler()
);
handlerMap.getOrDefault(type, new DefaultOrderHandler()).handle(order); - 无状态策略对象可复用,有状态的建议每次新建——工厂类可封装该逻辑
其他实用补充方案
不是非此即彼,有时组合使用效果更好。
- 卫语句提前退出:先处理边界情况(null、非法值、特殊标记),再进主逻辑,减少嵌套层级
-
Map 查表 + 函数式接口:适合轻量、纯计算逻辑,如
Map<string supplier>> rules = ...</string>,查到即执行 - sealed class + 模式匹配(Java 17+):比 enum 更灵活,支持带字段的封闭类型,配合 switch 可做结构化匹配
- 别硬套:范围判断(age >= 18)、布尔组合(isPaid && isShipped)、运行时计算值,这些都不适合 switch,应保留 if 或拆成职责明确的方法










