【问题标题】:Compiler error for string switch case label字符串开关盒标签的编译器错误
【发布时间】:2014-05-09 05:32:40
【问题描述】:

我有一个用于枚举常量的 switch case 标签。我的枚举和案例标签示例如下:

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;
    }
 }

整个case标签语句被eclipse标记为红线 “case PreferenceType.FIRST.toString():”当我将鼠标悬停在 case 标签上时,错误提示“case 表达式必须是常量表达式”。我的 jdk 是 1.7 版,我的 eclipse 是 3.7.2 版。谁能告诉我如何解决这个问题?

【问题讨论】:

标签: java string enums switch-statement


【解决方案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,然后可以在 switch 中使用它。

【讨论】:

  • 那行不通。还有其他解决方法吗?不过谢谢
  • 已编辑以处理您在开关中使用 prefKey。
  • 当我对上面提到的每个 case 标签使用 break 语句时,Eclipse 会说它是一个无法访问的代码。这背后的原因是什么?我有一个 return 语句,然后在下一个 case 标签开始之前有一个 break,例如 case PreferenceType.SECOND : return something;休息;
  • return 语句将强制执行中断该方法 - 因此无法访问 break 语句。您不需要在 return 语句之后直接使用 break 语句。
【解决方案2】:

错误信息说明了一切 -- case 表达式必须是常量表达式

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

【讨论】:

  • 当我对上面提到的每个 case 标签使用 break 语句时,Eclipse 会说它是一个无法访问的代码。这背后的原因是什么?我有一个 return 语句,然后在下一个 case 标签开始之前有一个 break,例如 case PreferenceType.SECOND : return something;休息;
  • 它已经说明了原因——因为它是无法访问的代码。您已经使用 return 语句从您的方法返回,之后您编写的任何其他内容都无法访问。只需删除休息时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-28
  • 1970-01-01
  • 2019-05-10
相关资源
最近更新 更多