字符串开关案例标签的编译器错误

时间:2014-05-09 05:32:40

标签: 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 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():”当我将鼠标悬停在案例标签上时,错误显示“案例表达式必须是常量表达式”。我的jdk版本是1.7,而我的eclipse版本是3.7.2。有人可以告诉我如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以在枚举上switch,但在字符串上不能switch

尝试:

private Enum PreferenceType {
    FIRST("key1"),SECOND("key2"),THIRD("key3");

    static Map<String, PreferenceType> prefMap = new HashMap<String, PreferenceType>();

    private String prefKey;

    PreferenceType(String prefKey) {
        this.prefKey = prefKey;
        prefMap.put(prefKey, this);
    }

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

    public static PreferenceType getPreferenceTypeFor(final String key) {
        return prefMap.get(key);
    } 
}

并且开关应该是......

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,然后可以在切换中使用它。

答案 1 :(得分:1)

错误消息说明了一切 - 案例表达式必须是常量表达式

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