如何在多个枚举中重用代码

我们知道java enum类:

  1. 隐式扩展java.lang.Enum;
  2. 不能从任何其他枚举类扩展。

我有多个枚举类,如下所示:

enum ResourceState { RUNNING, STOPPING,STARTTING;//... void aMethod() { // ... } } enum ServiceState { RUNNING, STOPPING,STARTTING,ERROR;//... void aMethod() { // ... } } 

枚举ResourceStateServiceState的方法aMethod()完全相同。

在OOP中,如果ResourceStateServiceState不是枚举,则它们应该将相同的方法抽象为超级抽象类,如下所示:

 abstract class AbstractState{ void aMethod() { // ... } } 

但是ResourceState无法从AbstractState扩展,你有什么想法可以解决吗?

啊,是的,这个限制让我咬了几次。 基本上,只要你有任何东西,除了你应用枚举的最简单的模型,它就会发生。

我发现解决这个问题的最好方法是使用从aMethod调用的静态方法的实用程序类。

枚举不能扩展其他类,但可以实现接口。 因此,更面向对象的方法是使您的枚举实现一个公共接口,然后使用委托给提供真正实现的支持类:

 public interface SomeInterface { void aMethod(); } public class SomeInterfaceSupport implements SomeInterface { public void aMethod() { //implementation } } public enum ResourceState implements SomeInterface { RUNNING, STOPPING,STARTTING; SomeInterfaceSupport someInterfaceSupport; ResourceState() { someInterfaceSupport = new SomeInterfaceSupport(); } @Override public void aMethod() { someInterfaceSupport.aMethod(); } } 

您可以使用旧的“Type Safe Enum设计模式”替换枚举:

 public class ResourceState { private ResourceState() { } public void aMethod() { .... } public static ResourceState RUNNING = new ResourceState(); public static ResourceState STOPPING = new ResourceState(); .... } 

然后扩展它并在需要时覆盖aMethod。