2

文字列の配列ではなく列挙型を使用して、他の開発者がコードをより拡張できるようにしようとしています。私は持っている:

public enum FOO {
   A, B, C, D, E
}

public enum BAR {
   Z, Y, X, W
}

繰り返し定義できるようにFOOしたい:

D, E, F(Z), F(Y), F(X), F(W)

そのため、BAR に項目を追加すると、自動的に FOO に追加されます。FOO のメソッドである必要があり、BAR はほぼ確実に内部クラス (つまりプライベート) である必要があると思いますが、その方法がわかりません。使用する

for (BAR b : BAR.values()) {}

少なくとも解決策の一部のようです。参考までに、私はパスファインダー RPG スキルを使用しています。各スキルのリストは次のとおりです。

public enum SkillsEnum {
    ACROBATICS,
    APPRAISE,
    BLUFF,
    CLIMB,
    CRAFT,
    DIPLOMACY,
    DISABLE_DEVICE,
    DISGUISE,
    ESCAPE_ARTIST,
    FLY,
    HANDLE_ANIMAL,
    HEAL,
    INTIMIDATE,
    KNOWLEDGE(KnowledgeList.values().[0])
    KNOWLEDGE(KnowledgeList.values().[1]) etc
}
enum KnowledgeList {
     ARCANA,
     DUNGEONEERING,
     ENGINEERING,
     GEOGRAPHY,
     HISTORY,
     LOCAL,
     NATURE,
     NOBILITY,
     PLANES,
     RELIGION
}
4

3 に答える 3

1

Enum インスタンスは C に似た構文によって魔法のように作成さpublic enum E { A, B, C }れ、コンパイル時にわかっていたとしてもインスタンスを追加することはできません。

各列挙型インスタンスにアタッチする必要があるロジックの量と、異なる「サブ列挙型」カテゴリの数に応じて、次のアプローチのいずれかを試すことができます。

パラメータを持つ単一の列挙型クラス

public enum Day {
    MONDAY(false),
    TUESDAY(false),
    WEDNESDAY(false),
    THURSDAY(false),
    FRIDAY(false),
    SATURDAY(true),
    SUNDAY(true);

    private final boolean weekend;

    private Day(boolean weekend) {
        this.weekend = weekend;
    }

    public boolean isWeekend() {
        return weekend;
    }

    public void doSomething() {
        if (isWeekend()) {
            // have fun
        } else {
            // do some work
        }
    }
}

長所: このアプローチでは、単一の列挙型クラスを持つことができ (たとえば、すべてのインスタンスで簡単に反復できます)、単純で、ボイラープレートを追加しません。

if短所: カテゴリ メンバーシップを頻繁にテストすると、コードがsで雑然とします。変数が特定のカテゴリのインスタンスを参照することをコンパイル時に強制することはできません。

インターフェイスを実装する列挙型

public interface Day {
    public void doSomething();
}

public enum WorkDay implements Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY;

    @Override
    public void doSomething() {
        // do some work
    }
}

public enum WeekEnd implements Day {
    SATURDAY,
    SUNDAY;

    @Override
    public void doSomething() {
        // have fun
    }
}

長所: 単一のカテゴリのインスタンスへの型安全な参照を持つことができます。メソッド内のカテゴリ固有のコードを分離して、メンバーシップ テストの必要性を減らすことができます。元のコードを変更せずに拡張できます。

短所:定型文が必要です(単純なケースでは多すぎるかもしれません)。すべてのインスタンスのコレクションが自動的に生成されるわけではありません。

インターフェイスを実装する列挙型のその他の例については、この回答を参照してください。

于 2013-03-05T23:06:56.617 に答える
1

へのアイテム追加についてBARJava のEnumは事前定義された定数のセットです。コンパイル時にそれらの値を知っておく必要があります。そもそも ENUM に項目を追加することはできません。あなたの質問を正しく解釈できたことを願っています。

于 2013-03-05T13:05:05.740 に答える
0

列挙型に値を動的に追加する方法がわかりません。コンパイル時にすべての値がわかるように設計されています。

別の方法として、列挙型を自分で実装することを検討してください (タイプ セーフな列挙型設計パターンを使用)。たとえば、「enum」B は「enum」A から拡張され、そのすべての値を継承します。

public class MyEnumA {
    private MyEnumA() {         
    }   
    public static MyEnumA a1 = new MyEnumA();
    public static MyEnumA a2 = new MyEnumA();
    public static MyEnumA a3 = new MyEnumA();
}

public class MyEnumB extends MyEnumA {
    private MyEnumB() {
        super();
    }   
    public static MyEnumB b1 = new MyEnumB();
    public static MyEnumB b2 = new MyEnumB();
    public static MyEnumB b3 = new MyEnumB();
}
于 2013-03-05T13:10:29.680 に答える