2013-10-28 75 views
0

我有以下類將字符串轉換爲枚舉。但我覺得這是某種程度上不適合使用枚舉的方法。我怎麼能做得更好?如何編寫從字符串到枚舉的良好轉換?

實例(也沒有意義,但足以說明我的問題):

enum LetterType { 
    ONE, TWO, THREE; 

    public static LetterType fromValue(String v) { 
     if (v.equals("A") || v.equals("B")) { 
      return ONE; 
     } else if (v.equals("C") { 
      return TWO; 
     } else if (v.equals("D") { 
      return THREE; 
     } 

     return null; 
    } 
} 
+1

你有沒有考慮維護'地圖<字符串,LetterType>'? –

+1

你可能會考慮http://codereview.stackexchange.com。我不覺得這個問題適合SO,因爲它會產生很多基於意見的答案,涉及哪些代碼更優雅。 –

回答

3

可能:

enum LetterType { 
ONE, TWO, THREE; 

private static Map<String, LetterType> stringValues; 
static { 
    stringValues = new HashMap<>(); 
    stringValues.put("A", ONE); 
    stringValues.put("B", ONE); 
    stringValues.put("C", TWO); 
    stringValues.put("D", THREE); 
} 

public static LetterType fromValue(String v) { 
    return stringValues.get(v); 
} 

}

+0

N.B.該映射應該是不可變的,或者至少是'Collections.unmodifiableMap()'。 –

+1

這是一張私人地圖,我希望沒有人會在枚舉本身修改它! – Tyco

0

這裏將有一些邏輯,它決定了值映射到枚舉。在C語言中,你可以通過將字符串轉換爲ASCII碼並使用一些公式來確定一個映射,從而完成一些無法讀取的技巧 - 請注意,我不會寬恕這種做法。在Java中,你將不得不做更具可讀性的方法,你需要指定哪些值映射到哪個枚舉。

您可以使用填充映射的Map<String, enum_type>來濃縮您的邏輯,也可以使用if/else塊。如果你想有一個直接的字符串 - >枚舉的枚舉的名稱是相同的字符串的值,您可以使用enumVariable.valueOf("StringGoesHere"),但您的示例似乎並不建議排序。