2012-04-05 9 views
2

私は、静的(または静的ではない)変数を列挙型の中に宣言したいと思います。列挙型の値をいくつかの文字列に関連付ける必要があるため、これが必要です。しかし、私はこの文字列をハードコードしたくありません。アプリケーション全体のクラスをString定数で使用したい。 I.私はenum declaratonの内側に、このように書きたいが、時間の誤差がコンパイル:JavaでEnum内のフィールドを宣言するにはどうすればいいですか?

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

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

私は列挙型のフィールドを置くことができますどのように?

+0

あなたはAppConstantsにgetインスタンスがありますか? 1つのインスタンスでも 'enum'にすることはできませんか? –

+1

実際に私はGWTを使用しています。 'Private AppMessages MESSAGES =(AppMessages)GWT.create(AppMessages.class);' – MyTitle

答えて

5

する必要があり、列挙型の値が最初を指定する必要がありますが、あなたは常にすべてのインスタンスで同じsingeltonを参照することができます"hello" を出力し...

enum MyEnum { 

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

    public final String val; 

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

例:

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; 
    } 
} 
2

enum定数は、それが限界の一つだ列挙の最初の要素

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; 
} 
} 
+0

-1、いいえ、あなたはできません: '定義される前にフィールドを参照できません。 – dacwe

+0

-1それは動作しません! – adarshr

+0

ありがとうございましたが、現在CONSTANTSはenums定数には表示されません。 – MyTitle

2

これは少しハッキーです。しかし、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) { 

    } 
} 
関連する問題