策略枚举通过在枚举中定义抽象方法并在各常量后实现,使每个枚举值兼具类型标识与可执行策略功能,调用时直接调用实例方法而无需switch分支,支持构造参数、状态封装及工厂查找,适用于逻辑稳定、差异明确的有限策略场景。

Java 中用策略枚举(Strategy Enum)可以把原本散落在 if-else 或 switch 里的分支逻辑,收拢到枚举常量自身的方法中,让调用方代码干净、可读性强,也更容易扩展。
把行为定义在枚举里
传统枚举只存数据,策略枚举则让每个枚举值自带处理逻辑。关键是在枚举中声明抽象方法,并在每个常量后用大括号实现它。
- 定义一个枚举,声明一个抽象方法(比如 execute())
- 每个枚举常量后面跟一对大括号,里面实现该方法的具体逻辑
- 这样每个枚举值就既是类型标识,又是可执行的策略实例
避免外部 switch 分支
原来要靠 switch 判断类型再调对应逻辑,现在直接调枚举实例的方法即可,完全不用判断。
- 比如有支付方式枚举 PAYMENT_ALIPAY、PAYMENT_WECHAT,各自实现 pay(Order order)
- 调用时只需 paymentType.pay(order),无需先 switch 再分发
- 新增一种支付方式?加一个枚举常量 + 实现 pay 方法,其他代码零修改
支持构造参数和内部状态
枚举可以有私有字段和构造器,适合封装策略所需的配置或依赖。
立即学习“Java免费学习笔记(深入)”;
- 例如某个策略需要特定的 HttpClient 或超时时间,可在构造时传入并保存为 final 字段
- 方法体内直接使用这些字段,避免每次调用都重复传参或查配置
- 注意:构造器必须是 private(枚举默认),字段推荐 final,保证不可变性
配合工厂方法统一获取策略
如果枚举类型来自字符串或数字(比如用户传参),可用静态方法根据 key 查找对应枚举,再调用策略。
- 在枚举里加一个 public static XxxEnum from(String code) 方法
- 内部用 Map 或数组预缓存映射关系,提升查找效率
- 调用方拿到枚举后直接 .execute(),整个链路无分支、无硬编码逻辑
策略枚举不是银弹,适合逻辑相对稳定、数量有限、每种策略差异明确的场景。它让代码从“判断+执行”变成“选一个对象然后执行”,职责更清晰,维护成本更低。


















