2012-04-30 15 views
8

爲什麼在開關盒中不可能使用枚舉值作爲字符串? (或者有什麼不對這個:)在開關盒中使用枚舉值的字符串表示形式

String argument; 
switch (argument) { 
    case MyEnum.VALUE1.toString(): // Isn't this equal to "VALUE1" ? 
    // something  
break; 
    case MyEnum.VALUE2.toString(): 
    // something else 
break; 

回答

22

您只能使用編譯時已知的字符串。編譯器無法確定該表達式的結果。

或許你可以嘗試

String argument = ... 
switch(MyEnum.valueOf(argument)) { 
    case VALUE1: 

    case VALUE2: 
+0

重要的是'VALUE1'是靜態的。你可以有自己的'myValueOf()',它仍然可以工作。 –

+0

該死的,'valueOf()'根本就不是'case'。我刪除了之前的評論,無法看到它。再次感謝。 – Bloke

+3

如果參數無效,請注意valueOf()會拋出NPE和IllegalArgumentException。 Bloke的代碼有意義避免處理這些異常(但可惜不起作用)。 – Nereis

5

情況MyEnum.VALUE1.toString()://這是不是等於 「VALUE1」?

不,不一定是:你可以自由地提供自己實現toString()

public enum MyType { 
VALUE1 { 
    public String toString() { 
     return "this is my value one"; 
    } 
}, 

VALUE2 { 
    public String toString() { 
     return "this is my value two"; 
    } 
} 

}

此外,人誰是維護你的代碼,你離開公司後可以添加這個實施。這就是爲什麼你不應該依賴字符串值,而是堅持使用enum的數字值(如常數MyEnum.VALUE1MyEnum.VALUE2等)代替。

+0

「你枚舉的數值」?你的意思是列舉枚舉的常量名稱? – assylias

+0

@assylias當然,我的意思是使用常量名稱,而不是對應於這些名稱的整數文字!謝謝,我編輯了答案以反映這個重要的觀點。 – dasblinkenlight

+0

哦,對。這是一個很好的解釋,謝謝。 – Bloke

1

爲了增加彼得Lawrey的評論,看看從去年this後其論述了之前和JDK7後字符串轉換在Java中。

+0

甚至不知道在JDK7之前這是不可能的。謝謝,在那裏發現了一個關於它的很好的鏈接:[link](http://www.xefer.com/2006/12/switchonstring) - 是處理String輸入的最好方法嗎? – Bloke

+1

那麼,一個純粹主義者可能會說,你不應該在OOP語言中使用switch/case語句;相反,你應該採用多態策略來處理這樣的事情。國際海事組織如果清楚,簡潔,可維護和高效,在許多情況下,案例/交換機是最佳解決方案。 – Sanjeev

-1

編輯:道歉爲C#回答Java問題。我不知道那裏出了什麼問題。

可能使用字符串值(包括枚舉的字符串值)。但是,您只能使用編譯時常量。您正在調用一個方法,ToString(),需要在運行時進行評估。

作爲C#6,則可以使用此常量替代:case nameof(SomeEnum.SomeValue):

Nameof()在編譯時被評估,只是一個給定的變量,類型或成員的(不合格)名稱相匹配的字符串。它的值與SomeEnum.ToString()相匹配。