Java 字符串开关大小写标签的编译器错误

Java 字符串开关大小写标签的编译器错误,java,string,enums,switch-statement,Java,String,Enums,Switch Statement,我有一个枚举常量的开关大小写标签。我的枚举和案例标签示例如下所示: private Enum PreferenceType { FIRST,SECOND,THIRD; private String prefKey; PreferenceType(String prefKey) { this.prefKey = prefKey; } @Override public String toString() { return prefKe

我有一个枚举常量的开关大小写标签。我的枚举和案例标签示例如下所示:

private Enum PreferenceType {
   FIRST,SECOND,THIRD;

   private String prefKey;

   PreferenceType(String prefKey) {
      this.prefKey = prefKey;
   }

   @Override
   public String toString() {
      return prefKey;
   } 
}

private String getPreference() {
   switch(getMessage())
   {
    case PreferenceType.FIRST.toString():
       //do something;
       break;

    case PreferenceType.SECOND.toString():
       //do something;
       break;

    case PreferenceType.THIRD.toString():
       //do something;
       break;
    default: break;
    }
 }
eclipse用红线标记了整个案例标签语句
“case PreferenceType.FIRST.toString():”当我将鼠标悬停在case标签上时,错误显示“case表达式必须是常量表达式”。我的jdk版本是1.7,我的eclipse版本是3.7.2。有人能告诉我如何解决这个问题吗?

您可以对枚举进行
切换
,但不能对字符串进行
切换

尝试:

你的案件陈述会是

switch(PreferenceType.getPreferenceTypeFor(getMessage()))
case PreferenceType.FIRST:
    //do something;
break;

case PreferenceType.SECOND:
    //do something;
break;

case PreferenceType.THIRD:
    //do something;
break;

现在,当您调用PreferenceType.getPreferenceTypeFor(“key1”)时,您将首先得到PreferenceType.FIRST,然后可以在开关中使用它。

错误消息说明了这一切--大小写表达式必须是常量表达式


您使用的是toString()方法的返回值,就编译器而言,它不是常量。

搜索错误消息的可能重复;这不是新的编译器错误,您也不是第一个遇到此错误的人。另请参见,我的问题与此不同。我想知道为什么即使Eclipse3.7.2支持Java7特性,case标签也会抛出错误。此外,已经提到的答案与我的代码人员无关,因此请停止将其标记为副本。在这个问题上我已经筋疲力尽了,请有人帮我解决一下。在你的枚举中,构造函数接受一个参数,但是你的枚举定义(第一、第二、第三)没有提供参数。你能把真实的密码贴出来吗?那不行。还有其他解决办法吗?尽管如此,我还是非常感谢您在交换机中使用prefKey。当我对上面提到的每个case标签使用break语句时,Eclipse说这是一个无法访问的代码。这背后的原因是什么?我有一个return语句,然后在开始下一个case标签(如case PreferenceType)之前有一个break语句;打破return语句将强制执行中断方法-因此无法访问break语句。您不需要在return语句之后直接使用break语句,当我对上面提到的每个case标签使用break语句时,Eclipse说这是一个无法访问的代码。这背后的原因是什么?我有一个return语句,然后在开始下一个case标签(如case PreferenceType)之前有一个break语句;打破它已经说明了原因——因为它是无法访问的代码。您已经使用return语句从方法返回,之后编写的任何其他内容都是不可访问的。只需去除断裂。
case PreferenceType.FIRST:
    //do something;
break;

case PreferenceType.SECOND:
    //do something;
break;

case PreferenceType.THIRD:
    //do something;
break;