Java 在开关情况下使用枚举值的字符串表示

Java 在开关情况下使用枚举值的字符串表示,java,enums,switch-statement,case,tostring,Java,Enums,Switch Statement,Case,Tostring,为什么在开关情况下不能将枚举值用作字符串?(或者这有什么不对:) case MyEnum.VALUE1.toString()://这不是等于“VALUE1”吗 不,不一定:您可以自由提供自己的toString()实现。 } 此外,维护您的代码的人可以在您离开公司后添加此实现。这就是为什么您不应该依赖字符串值,而应该坚持使用enum的数值(如常量MyEnum.VALUE1,MyEnum.VALUE2等所示)。您只能使用编译时已知的字符串。编译器无法确定该表达式的结果 也许你可以试试 String

为什么在开关情况下不能将枚举值用作字符串?(或者这有什么不对:)

case MyEnum.VALUE1.toString()://这不是等于“VALUE1”吗

不,不一定:您可以自由提供自己的
toString()实现。

}


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

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

也许你可以试试

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

   case VALUE2:

为了补充Peter Lawrey的评论,请看一看去年的帖子,其中讨论了在JDK7前后在Java中切换字符串。

“枚举的数值”?你的意思是枚举的常量名吗?@assylias当然,我的意思是使用常量名,而不是对应于这些名称的整数文字!谢谢,我编辑了答案以反映这一要点。重要的是,
VALUE1
是静态的。您可以拥有自己的
myValueOf()
,它仍然可以工作。请注意valueOf(),如果参数无效,它会抛出NPE和IllegalArgumentException。Bloke的代码可以避免处理这些异常(但遗憾的是不起作用)。很好的解决方案!谢谢,在JDK7之前,你甚至不知道这是不可能的。谢谢,在那里的评论中找到了一个很好的链接:-这是处理字符串输入的最佳方式吗?好吧,一个纯粹主义者可能会说,你根本不应该在OOP语言中使用switch/case语句;相反,您应该使用多态性策略来处理类似的问题。依我看,如果案例/切换清晰、简洁、可维护且高效,那么它是许多场景中的最佳解决方案。
public enum MyType {
VALUE1 {
    public String toString() {
        return "this is my value one";
    }
},

VALUE2 {
    public String toString() {
        return "this is my value two";
    }
}
String argument = ...
switch(MyEnum.valueOf(argument)) {
   case VALUE1:

   case VALUE2: