代码示例
理论
枚举的行为多态
public enum MyLockStrategy {SKIP_FAST(){@Overridepublic boolean tryLock(RLock lock, MyLock prop) throws InterruptedException {return lock.tryLock(0, prop.leaseTime(), prop.unit());}},FAIL_AFTER_RETRY_TIMEOUT(){@Overridepublic boolean tryLock(RLock lock, MyLock prop) throws InterruptedException {boolean isLock = lock.tryLock(prop.waitTime(), prop.leaseTime(), prop.unit());if (!isLock) {throw new BizIllegalException("请求太频繁");}return true;}},;public abstract boolean tryLock(RLock lock, MyLock prop) throws InterruptedException;
}
为什么可以重写本类的抽象方法
Java 中的枚举本质上是 一种特殊的类(继承自 java.lang.Enum
),每一个枚举常量(比如 SKIP_FAST
、FAIL_FAST
)都是该类的一个 实例(对象)。
如果你在枚举中声明了 抽象方法,那么:
✅ 每一个枚举常量都必须实现这个抽象方法,因为它们都是枚举类的“子类”或“匿名内部类”的形式存在。
这在 Java 中被称为 枚举的“行为多态”能力。
这种设计的好处是什么?
-
策略模式(Strategy Pattern)
每个枚举常量代表一种锁的获取策略,调用时可以根据实际需求选择不同策略。
补充说明:枚举和匿名内部类的关系
虽然 Java 的枚举看起来像是一组常量,但实际上:
- 每个枚举值其实是一个 匿名内部类的实例;
- 如果枚举类有抽象方法,那这些枚举值就必须实现这些方法;
- 所以你在枚举中看到的类似类的写法
{ ... }
,其实是创建了一个该枚举类的匿名子类。