1

重複の可能性:
Java Enums を拡張することは可能ですか?

特定の数の値を持つ列挙型があるという小さな問題があります。この列挙型はシステムの複数の部分で使用され、場合によってはさらに値を含める必要があります。

Java では列挙型の拡張が許可されていないため、いくつかの代替案を考えてみましたが、これまでの私の解決策は、システムのすべての部分に共通の値を持つ列挙型を含むインターフェイスを作成し、これを実装するための空のクラスを作成することでした。インターフェース。

だからenum A implements I私は使うことができますA.COMMON_ENUM.ENUM_VALUE

enum Bこれで、列挙型を含むシステムのサブ部分に新しいものを作成し、ADDITIONAL_ENUMそれを実装できIます。だから今私はこれを使うことができます:

B.COMMON_ENUM.ENUM_VALUE

また

B.ADDITIONAL_ENUM.ADDED_ENUM_VALUE

これは醜い解決策ですか?-つまり、機能しますが、間違っているようです...

- - - アップデート: - - -

共通の列挙型はシステムの「コア」部分 (複数のフロントエンドを持つことができます) にあり、追加の列挙型はフロントエンドごとに異なります。類推を使用するには: VEHICLE enum に ENGINE、DOORS があり、CAR フロントエンドに「WHEELS」を追加する必要があり、BOAT フロントエンドに「PROPELLER」を追加する必要があるとします。

コード例:

public interface EnumType {           // I
    public enum Core {
    VALUE1,
    VALUE2,
    VALUE3
    }
}

public enum CommonEnum implements EnumType {     // A

}

public enum AdditionalEnumType implements EnumType {     // B
    public enum Additional {
    VALUEX,
    VALUEY
    }
}
4

3 に答える 3

6

私は同様のパターンを使用しますが、なぜあなたが入れ子になっているのか理解できません。私の場合は次のようになります。

interface SomeType {
  String name();
}

public enum CoreEnum implements SomeType {
  VALUE1,
  VALUE2;
}

public enum AdditionalEnum implements SomeType {
  VALUE3,
  VALUE4;
}
于 2013-01-17T10:41:30.343 に答える
1

その目的のために、タイプセーフな列挙型パターンについて読むかもしれません。インターフェースを導入して大丈夫でした。したがって、API ではそのインターフェースのみに依存する必要があります。そのインターフェースの実装が列挙型またはクラスによって行われる場合、API ユーザーは気にする必要はありません。

それについて悪いことは何も見えません。

于 2013-01-17T08:56:21.540 に答える
0

設計により列挙型に似た独自のクラスを作成できます

public class A {
    A() {}  
    public static final A A1 = new A();
    public static final A A2 = new A();
    @Override
    public String toString() {
        return getClass().getSimpleName();
    }
}

public class B extends A {
    B() {}
    public static final A A3 = new A();
}
于 2013-01-17T09:42:54.743 に答える