Java中用枚举配合策略模式消除if-else,核心是让每个枚举项直接实现策略接口并承载行为逻辑,通过code字段替代valueOf实现安全转换,配合@JsonValue和@JsonCreator支持序列化,新增策略只需添加枚举项,符合开闭原则。

Java中用枚举配合策略模式消除if-else,核心是让每个枚举项直接承载行为逻辑,而不是只当“命名常量”用。它比传统策略模式更轻量——不用额外建一堆Strategy实现类,也不需要Factory或Map映射,所有策略实例天然单例、类型安全、编译期校验。
让枚举实现策略接口
定义一个策略接口(比如DiscountStrategy),然后让枚举直接implements它。每个枚举值在声明时通过构造器传入具体逻辑(常用lambda或方法引用):
- 接口方法必须是抽象的,不能有默认实现,否则枚举项可能意外继承而非重写
- 避免把枚举当“高级常量”,空枚举+外部工厂类反而增加间接层和出错点
- 枚举构造器里别调用其他尚未初始化的枚举项,否则触发ExceptionInInitializerError
用code字段替代valueOf做安全转换
外部输入(如HTTP参数、JSON字段)通常带业务码(如"early_bird"),不能直接用Enum.valueOf()——它严格匹配枚举名且不处理大小写或下划线。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 为每个枚举项加一个code字段,例如EARLY_BIRD("early_bird", price -> ...)
- 提供静态fromCode(String code)方法,内部遍历查找匹配的code
- 查不到时明确返回null或抛自定义异常,不要静默fallback到第一个枚举项
序列化与反序列化要兼容
Spring Boot或JSON场景下,枚举需正确序列化/反序列化,否则前端传"early_bird"后端收不到对应枚举。
立即学习“Java免费学习笔记(深入)”;
- 给策略接口方法加@JsonValue,让它决定输出什么字符串
- 加@JsonCreator标注静态工厂方法,支持从code字符串反序列化
- 避免用ordinal()或name()作为传输标识,它们易受枚举顺序或重命名影响
新增策略无需改老代码
符合开闭原则:加一种新折扣类型,只需新增一个枚举项并实现逻辑,调用方代码完全不动。
- 原来if-else分支越多,维护成本越高;枚举策略下,所有策略集中声明、一目了然
- IDE能自动提示可用枚举项,编译期捕获非法值,比字符串硬编码更可靠
- 单元测试可直接对每个枚举项调用apply(),覆盖粒度细、无遗漏

















