2012-04-05 63 views
2

我想在Enum中聲明靜態(或非靜態)變量。我需要這個,因爲我想將枚舉值與某些字符串關聯。但我不想硬編碼這些字符串。我想用String常量來使用我的應用程序範圍的類。 也就是說我想寫像這裏面enum declaraton,但編譯時錯誤:如何在Java中的Enum中聲明字段?

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

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

我怎麼能枚舉把一個領域?

+0

爲什麼你的AppConstants有一個get實例?它可以不是一個'enum'以及一個實例嗎? – 2012-04-05 12:13:55

+1

事實上,我使用GWT,並有'私人AppMessages MESSAGES =(AppMessages)GWT.create(AppMessages.class);' – MyTitle 2012-04-05 12:20:33

回答

5

這是限制之一的第一要素,枚舉值必須指定第一但你總是可以指同一singelton在每一個實例...

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

枚舉常量必須在枚舉

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 2012-04-05 12:10:38

+0

-1這是行不通的! – adarshr 2012-04-05 12:10:52

+0

謝謝,但現在提交CONSTANTS是不可見的枚舉常量:) – MyTitle 2012-04-05 12:11:17

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) { 

    } 
}