2012-10-08 59 views
0

假設我在我的Java枚舉中有多個字段(Stringint),並且我想動態地根據其名稱獲取字段值。在Java中調用枚舉

public enum Code { 

    FIRST("valueForFirst"), 
    SECOND("valueForSecond"); 
    // etc 
} 

然後我得到我想要的字段的名稱:

String fieldName = getEnumFieldName(); // can be: "FIRST" or "SECOND" 
// now get "fieldName"'s value from Code 

我怎樣才能做到這一點?

+2

見http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#valueOf%28java.lang.Class,%20java.lang.String %29 – 2012-10-08 12:44:33

+0

我想我不清楚。我有興趣引用這個枚舉。 – Madrugada

回答

4

您需要使用Enum.valueOf();如:

Code c = Code.valueOf(Code.class, fieldName); 
+0

我認爲這正是我正在尋找的,謝謝 – Madrugada

+0

@Madrugada指定'Code.class'是reduntant。 – maba

+0

確實........ – Madrugada

2

如果是從別的地方以字符串形式讓您的字段的名稱,你可以使用valueOf()方法來獲得枚舉實例。但是,首先你需要轉換字符串中的所有大寫..

String fieldName = getEnumFieldName(); 
Code first = Code.valueOf(fieldName); 
String value = first.getValue(); 

經過本教程 - http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html有關如何使用Enums更多信息..

+0

謝謝。問題是我不知道fieldName是「FIRST」還是「SECOND」,它是動態的。 – Madrugada

+0

如果字段名稱是動態的(我不知道它是如何可能的或爲什麼這是個好主意),您可以使用反射來查看枚舉提供的字段。 –

+0

@Madrugada ..你怎麼得到它?動態? –

2

你可以這樣定義你的枚舉:

public enum Code { 

    private String value; 

    public Code(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 

    FIRST("valueForFirst"), 
    SECOND("valueForSecond"); 
} 

,然後用它是這樣的:

Code code = Code.FIRST; 
String val = code.getValue(); 

或像這樣:

String key = "FIRST"; 
Code code = Code.valueOf(key); 
String val = code.getValue(); 

如果你想從一個代碼獲得 「第一」,只是做

String name = code.name(); 
+0

爲什麼有人downvote?那是臭名昭着的「戰術降價」嗎? –

+0

我沒有。我更新了我的問題,我希望現在它更清晰 – Madrugada

+0

@Madrugada在我的答案中是缺少的東西? –

0

下面是我用的模式:

enum X { 
    A("a"), B("b"), ...; 

    private final static Map<String,X> MAP = new HashMap<String,X>(); 
    static { 
     for(X elem: X.values()) { 
      if(null != MAP.put(elem.getValue(), elem)) { 
       throw new IllegalArgumentException("Duplicate value " + elem.getValue()); 
      } 
     } 
    } 

    private final String value; 

    private X(String value) { this.value = value; } 
    public String getValue() { return value; } 

    // You may want to throw an error here if the map doesn't contain the key 
    public static X byValue(String value) { return MAP.get(value); } 
} 

這看起來有點奇怪訪問enum類型的實例在staticenum聲明內,但此代碼的工作。

在你的情況下,可能會看起來像這樣:

String fieldName = Code.valueOf(Code.class).getValue(); 
1

您可以使用valueOf()方法的枚舉。

String fieldName = "FIRST"; // or "SECOND" 
Code c = Code.valueOf(fieldName); 
0
public enum Code { 

     FIRST("valueForFirst"), 
     SECOND("valueForSecond"); 

    } 

    public class Test{ 

     Code c; 

     public static void main(String[] args){ 

     Test t = new Test(); 

     String val = t.c.FIRST.getValue(); 



     } 

    }