【问题标题】:In Java switch statements on enums, why am I getting a compilation error when I qualify my values in each case?在枚举的 Java switch 语句中,当我在每种情况下限定我的值时,为什么会出现编译错误?
【发布时间】:2009-06-08 14:46:20
【问题描述】:

我在 Java 中有一个 switch 语句,在一个 Enum 上,我们可以调用 IMyInterface.MyEnum

我的每个案例陈述都有以下形式: IMyInterface.MyEnum.MyValue,(虽然如果我导入了 IMyInterface,我可以删除)。

但是,编译器 (Java 6) 会抛出错误: "合格的案例标签 IMyInterface.MyEnum.MyValue 必须替换为不合格的枚举常量 MyValue"。

我显然可以这样做,但是对于我的一生,我不明白这个错误的目的是什么。显然,如果编译器能够处理实际值,它应该能够像处理常量一样处理全限定名。事实上,我会假设编译器会将常量转换为完全限定名称。

那么,Java 专家,这背后的基本原理是什么? 谢谢!

【问题讨论】:

  • 就个人而言,我不介意枚举不能在 switch-case 块中进行限定;它使代码更具可读性。请记住,对于您拥有的枚举类(在您可以编辑的代码中),最佳实践是永远不要使用 switch-case 块。在这种情况下,特定于枚举常量的方法比 switch-case 更易于维护且更不脆弱。

标签: java enums switch-statement


【解决方案1】:

来自 JLS:

(需要内联常量的一个原因是 switch 语句在每种情况下都需要常量,并且没有两个这样的常量值可能相同。编译器在编译时检查 switch 语句中的重复常量值;类文件格式不做大小写的符号链接。)

你可以找到它here。

【讨论】:

  • 你是怎么找到那个位的? +1 大海捞针。
  • 大声笑我记得曾经读过一些关于这个的东西......幸运的是我的桌面上有 JLS PDF 只是为了这些场合;)
  • 我收藏了它(所以我只需打开一个新标签并输入 JLS),但我仍然找不到任何相关内容。我想我不认为二进制兼容性是一个可能的原因。
  • 我的上帝...+1(和道具)细节。
【解决方案2】:

这很奇怪。我不得不做一些挖掘自己来了解这一点。似乎在打开的对象上键入 check 比在完整的限定名称中更安全。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6191812 是一个错误报告,允许您指定合格的枚举,但由于您可以在附件中看到的原因,它已关闭且未执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2013-12-28
    相关资源
    最近更新 更多