2013-10-03 42 views
6

假設你有以下枚舉爪哇 - 枚舉的valueOf「覆蓋」命名約定

public enum Color { 
    RED("R"), GREEN("G"), BLUE("B"); 
    private String shortName; 

    private Color(String shortName) { 
     this.shortName = shortName; 
    } 

    public static Color getColorByName(String shortName) { 
     for (Color color : Color.values()) { 
      if (color.shortName.equals(shortName)) { 
       return color; 
      } 
     } 
     throw new IllegalArgumentException("Illegal color name: " + shortName); 
    } 
} 

由於枚舉是一種特殊情況下,當你不能只是覆蓋的valueOf功能,什麼是對的命名規則繞過這個並實現valueOf(String name)?

getColorByName(String name) 
getValueOf(String name) 
permissiveValueOf(String name) 
customValueOf(String name) 
forName(String name) 
getEnum(String name) 
getColor(String name) 

後來編輯: 我看到布洛赫有效的Java第二版。根據getInstance()(第1章,第1項)提出了一些建議。 只是添加另一個選項。

+5

http://en.wikipedia.org/wiki/Method_overriding#Java 重寫方法保持名稱。 –

+0

即使重載也保持相同的名稱,但會改變簽名。這聽起來像我們在談論完全不同的名字...... –

+5

夥計們......我們正在談論枚舉。您無法覆蓋valueOf()和values()。我會改變標題來指出這一點。但請刪除您的不滿意票並給我一個答案。 –

回答

13

你是絕對正確的,你不能覆蓋Enum#valueOf(),因爲它是Enum類的靜態方法。

我不認爲有一個命名約定。正如我們已經指出的那樣,有幾個例子在Java中:

我不會用getEnum,因爲你沒有得到Enum本身,而是值。 在這裏使用forName()不合適,R不是名稱的紅色。

我寧願去:

  • fromString()因爲它是一個相對toString();
  • getColor()與Java標準庫保持一致。
+0

問題是我無法在Enum的Java規範中找到任何示例。顏色和類是類而不是枚舉。因此你也可以添加一個valueOf方法,但是你不能做一個開關(顏色) –

+0

「fromBlah」對我來說很有意義。例如,請參閱'Response.Status.fromStatusCode'。 – jtoberon

+0

沒有標準,也不是很常見,所以你也不可能找到任何強大的公約。除非你想開始搞亂cglib(!)fromString可能是最好的。當然,沒有人會在閱讀時感到困惑。 –

1

我會用一對:

Color fromValue(String value) 
String toValue() 

這事,我已經找到最適合我的枚舉。

2

請考慮以下事項!

Color fromName(String name); 
Color fromShortName(String shortName); 
Color fromCode(String code);