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 に答える