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

时间:2012-04-30 16:43:43

标签: java enums switch-statement case tostring

为什么在切换案例中不能将枚举值用作字符串? (或者这有什么问题:)

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

4 个答案:

答案 0 :(得分:29)

您只能使用编译时已知的字符串。编译器无法确定该表达式的结果。

也许你可以试试

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

   case VALUE2:

答案 1 :(得分:7)

  

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值,而是坚持使用MyEnum.VALUE1的数值(由常量MyEnum.VALUE2enum等表示)。

答案 2 :(得分:1)

要添加Peter Lawrey的评论,请查看去年发表的this帖子,其中讨论了在JDK7之前和之后使用Java切换字符串。

答案 3 :(得分:-1)

编辑:为Java问题的C#答案道歉。我不知道那里出了什么问题。

可以使用字符串值(包括枚举的字符串值)。但是,您只能使用编译时常量。您正在调用一个方法ToString(),需要在运行时进行评估。

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

Nameof()在编译时被评估,只是一个与给定变量,类型或成员的(非限定)名称匹配的字符串。它的值与SomeEnum.ToString()的值相匹配。