2

列挙型内で静的(または静的ではない)変数を宣言したい。列挙値をいくつかの文字列に関連付けたいので、これが必要です。しかし、私はこの文字列をハードコーディングしたくありません。アプリケーション全体のクラスを文字列定数で使用したいと思います。つまり、宣言内でこのように記述したいのですenumが、コンパイル時エラーが発生します。

public enum MyEnum {   
        private static final AppConstants CONSTANTS = AppConstants.getInstance();

        ONE(CONSTANTS.one()),
        TWO(CONSTANTS.two());
}

列挙型フィールドを入力するにはどうすればよいですか?

4

3 に答える 3

4

これは制限の1つであり、列挙値を最初に指定する必要がありますが、すべてのインスタンス化で常に同じシングルトンを参照できます...

enum MyEnum {

    ONE(Test.getInstance().one()),
    TWO(Test.getInstance().two());

    public final String val;

    MyEnum(String val) { this.val = val; }
}

「hello」を出力する例:

public class Test {
    public static void main(String[] args) {
        System.out.println(MyEnum.ONE.val);
    }

    public String one() {
        return "hello";
    }
    public String two() {
        return "world" ;
    }

    static Test instance;
    public synchronized static Test getInstance() {
        if (instance == null)
            instance = new Test();
        return instance;
    }
}
于 2012-04-05T12:11:09.127 に答える
3

少しハッキーです。AppConstantsただし、クラスを少し変更する必要があります。

public enum MyEnum {   
    ONE(getConstant("one")),
    TWO(getConstant("one"));

    private static final AppConstants CONSTANTS = AppConstants.getInstance();

    private static String getConstant(String key) {
        // You can use a map inside the AppConstants or you can 
        // invoke the right method using reflection. Up to you.
        return CONSTANTS.get(key);
    }

    private MyEnum(String value) {

    }
}
于 2012-04-05T12:12:39.797 に答える
2

列挙型定数は、列挙型の最初の要素である必要があります

public enum MyEnum {   

    ONE,TWO;
    private static final AppConstants CONSTANTS = AppConstants.getInstance();

    @Override 
public String toString() {
       if(this==ONE){
           return CONSTANTS.one();
       } else if(this==TWO){
           return CONSTANTS.two();
       }
    return null;
}
}
于 2012-04-05T12:08:13.957 に答える