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

时间:2013-03-20 12:45:17

标签: java oop enums

我们知道java enum类:

  1. 隐式扩展java.lang.Enum;
  2. 不能从任何其他枚举类扩展。
  3. 我有多个枚举类,如下所示:

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

    枚举aMethod()ResourceState中的方法ServiceState完全相同。

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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();
    }
}

答案 1 :(得分:3)

啊,是的,这个限制让我咬了几次。基本上,除了你应用枚举的最简单的模型之外,它会发生。

我找到解决此问题的最佳方法是使用从aMethod调用的静态方法的实用程序类。

答案 2 :(得分:2)

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

public class ResourceState {
    private ResourceState() {
    }

    public void aMethod() { .... }

    public static ResourceState RUNNING = new ResourceState();
    public static ResourceState STOPPING = new ResourceState();
    ....
}

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