7

正如我们所知,java枚举类:

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

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

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

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

aMethod()enum中的方法ResourceStateServiceState完全一样。

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

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

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

4

3 回答 3

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();
    }
}
于 2013-03-20T13:08:55.487 回答
3

啊,是的,这个限制已经咬了我好几次了。基本上,只要您拥有应用枚举的最微不足道的模型,就会发生这种情况。

我发现解决此问题的最佳方法是使用从您的aMethod.

于 2013-03-20T12:48:41.353 回答
2

您可以用旧的“类型安全枚举设计模式”替换枚举:

public class ResourceState {
    private ResourceState() {
    }

    public void aMethod() { .... }

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

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

于 2013-03-20T12:55:38.853 回答