2015-07-11 90 views
0

給定一個字符串,我想在常量時間內獲得它的枚舉等價物。 我有一個枚舉定義,如問題中所示。 Best way to create enum of strings?高效地將java字符串轉換爲等價的枚舉

public enum Strings { 
STRING_ONE("ONE"), 
STRING_TWO("TWO") 
; 

private final String text; 

/** 
* @param text 
*/ 
private Strings(final String text) { 
    this.text = text; 
} 

/* (non-Javadoc) 
* @see java.lang.Enum#toString() 
*/ 
@Override 
public String toString() { 
    return text; 
} 
} 

如果我現在得到一個字符串(說「二」),是有辦法,看它是否存在,如果再把它存在是有辦法,我可以定義將返回枚舉值的方法(例如,如果我通過「兩個」,我應該回來「Strings.STRING_TWO」?

+1

是否將它們命名爲'ONE','TWO'並使用'Strings.valueOf(String)'選項?似乎重複的有'Strings.STRING_ *'。 –

回答

3

Enum.valueOf()是不是足夠?你會想象如何更有效率嗎?有(通常)不需要有一個枚舉STRING_ONE("ONE") - 只需調用枚舉值ONE即可免費獲得.valueOf()查詢

否則,只需創建一個private static Map<String, YourEnum>並提供類似valueOf()的方法,該方法查找Map

0

我認爲你需要改變的代碼爲:

public enum Strings { 
     STRING_ONE("ONE"), STRING_TWO("TWO"); 

     private String text; 

     /** 
     * @param text 
     */ 
     private Strings(final String text) { 
      this.text = text; 
     } 

     public String getText() { 
      return this.text; 
     } 

     public static Strings getByTextValue(String text) { 
      for (Strings str : Strings.values()) { 
       if (str.getText().equals(text)) { 
        return str; 
       } 
      } 
      return null; 
     } 

     /* 
     * (non-Javadoc) 
     * 
     * @see java.lang.Enum#toString() 
     */ 
     @Override 
     public String toString() { 
      return text; 
     } 
    } 

例子:

String test = "ONE"; 
Strings testEnum = Strings.getByTextValue(test); 

現在你有testEnum這是enum參考

1

由於Enum.valueOf操作上的內置名稱(即"STRING_ONE""STRING_TWO"),你將需要推出的名稱到枚舉自己的「註冊表」,像這樣:

public enum Strings { 
    STRING_ONE("ONE"), 
    STRING_TWO("TWO") 
    ; 
    private static final Map<String,Strings> byName = new HashMap<String,Strings>(); 
    private final String text; 

    private Strings(final String text) { 
     this.text = text; 
    } 
    static { 
     for (Strings s : Strings.values()) { 
      byName.put(s.toString(), s); 
     } 
    } 
    @Override 
    public String toString() { 
     return text; 
    } 
    public static Strings forName(String name) { 
     return byName.get(name); 
    } 
} 

Demo.

以上,從字符串名稱的地圖enum Strings是用來做什麼的翻譯。如果名稱不存在,將從Strings.forName方法返回null