簡體   English   中英

在switch-case中使用枚舉值的字符串表示

[英]Using string representations of enum values in switch-case

為什么在交換機情況下不能將枚舉值用作字符串? (或者這有什么問題:)

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

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

也許你可以試試

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

   case VALUE2:

case 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";
    }
}

}

此外,維護代碼的人可以在您離開公司后添加此實現。 這就是為什么你不應該依賴String值,而是堅持使用你的enum的數值(由常量MyEnum.VALUE1MyEnum.VALUE2等表示)。

為了增加Peter Lawrey的評論,請看看去年發表的這篇文章, 文章討論了JDK7之前和之后的Java中的字符串切換。

編輯 :為Java問題的C#答案道歉。 我不知道那里出了什么問題。

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

從C#6開始,您可以使用此常量替代方法: case nameof(SomeEnum.SomeValue):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM