Java枚举类通过定义抽象方法并由各常量实现,天然支持策略模式多态分发;每个枚举项作为匿名子类封装策略逻辑,具备不可变性、线程安全及编译期完整性检查。

Java 枚举类可以通过在枚举中定义抽象方法,并让每个枚举常量提供自己的实现,来天然支持策略模式的多态分发——这本质上是“枚举 + 抽象方法”的组合,利用了枚举实例的唯一性和可重写性。
在枚举中声明抽象方法
枚举类本身可以是抽象的,从而允许定义抽象方法。每个枚举常量(如 ADD、MULTIPLY)作为匿名子类实例,可分别实现该方法:
public enum Operation {
ADD {
@Override
public double apply(double a, double b) {
return a + b;
}
},
MULTIPLY {
@Override
public double apply(double a, double b) {
return a * b;
}
};
<pre class="brush:php;toolbar:false;">// 声明抽象方法(枚举类自动变为 abstract)
public abstract double apply(double a, double b);}
调用时无需 if-else 或 switch,直接多态分发
使用时只需持有枚举实例,调用其抽象方法即可动态绑定到对应实现,完全避免硬编码分支逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Operation op = Operation.ADD; double result = op.apply(3.0, 4.0); // 自动调用 ADD 的实现 → 7.0 <p>op = Operation.MULTIPLY; result = op.apply(3.0, 4.0); // 自动调用 MULTIPLY 的实现 → 12.0</p>
- 每个策略被封装在枚举常量内部,职责清晰、不可变、线程安全
- 新增策略只需添加新枚举项并实现方法,符合开闭原则
- 编译期检查完整性:若新增枚举值但未实现抽象方法,会直接编译失败
扩展:带构造参数和状态的策略
枚举常量还可携带配置或内部状态,让策略更灵活。例如支持不同精度的四舍五入策略:
public enum RoundingStrategy {
UP(BigDecimal.ROUND_UP),
DOWN(BigDecimal.ROUND_DOWN),
HALF_UP(BigDecimal.ROUND_HALF_UP);
<pre class="brush:php;toolbar:false;">private final int mode;
RoundingStrategy(int mode) {
this.mode = mode;
}
public BigDecimal round(BigDecimal value, int scale) {
return value.setScale(scale, mode);
}}
- 构造器参数用于初始化策略相关状态(如舍入模式)
- 非抽象方法也可复用逻辑,必要时仍可叠加抽象方法做行为定制
- 所有实例共享同一枚举类型,类型安全,且 IDE 可自动补全所有策略选项
对比传统策略模式的明显优势
- 无需单独定义多个策略类或实现类,代码更紧凑
- 枚举天然单例、不可继承、不可反射创建新实例,安全性更高
- 策略集合封闭可控(枚举项固定),适合领域内有限且稳定的策略集
- 序列化/反序列化友好,枚举名即标识,无反射或字符串解析风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










