为什么不能使用枚举值作为开关的情况下琴弦? (或者有什么不对这个:)
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 (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:
情况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.VALUE1
, MyEnum.VALUE2
你的,等) enum
!而非。
为了增加彼得Lawrey的意见,看看这个职位从去年其论述了之前和JDK7后字符串转换在Java中。
编辑 :对于C#的答案为Java问题道歉。 我不知道哪里出了问题存在。
它可以使用字符串值(包括枚举的字符串值)。 但是,您可能只使用编译时间常数 。 要调用方法, ToString()
,它需要在运行时进行评估。
作为C#6,则可以使用此常量替代: case nameof(SomeEnum.SomeValue):
Nameof()在编译时被评估,只是一个给定的变量,类型或成员的(不合格)名称相匹配的字符串。 它的价值相匹配的SomeEnum.ToString()