在开关的情况下使用枚举值的字符串表示(Using string representations of

2019-06-24 02:10发布

为什么不能使用枚举值作为开关的情况下琴弦? (或者有什么不对这个:)

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

Answer 1:

您只能使用其在编译时已知的字符串。 编译器不能确定表达式的结果。

也许你可以试试

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

   case VALUE2:


Answer 2:

情况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";
    }
}

}

此外,你离开公司后,人谁是维护你的代码可以添加此实现。 这就是为什么你不应该依赖于字符串值,并坚持使用的数值(如由常量表示MyEnum.VALUE1MyEnum.VALUE2你的,等) enum !而非。



Answer 3:

为了增加彼得Lawrey的意见,看看这个职位从去年其论述了之前和JDK7后字符串转换在Java中。



Answer 4:

编辑 :对于C#的答案为Java问题道歉。 我不知道哪里出了问题存在。

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

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

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



文章来源: Using string representations of enum values in switch-case