【问题标题】:Why must enum constants be unqualified in switch cases in java? [duplicate]java - 为什么在Java的switch case中枚举常量必须是不合格的? [复制]
【发布时间】:2021-08-17 08:27:06
【问题描述】:

一点上下文。这是关于 switch case 中限定枚举名称的问题,如示例中所示:

enum MyEnum {
    A,
    B,
    ;
}
switch(methodReturnungMyEnum()){
case MyEnum.A:
    // ...
    break
case MyEnum.B:
    // ...
    break
}

导致编译器错误

枚举 switch case 标签必须是枚举常量的非限定名称

是的。解决方案很简单:删除MyEnum. 部分。那不是我的问题。

我只是想知道为什么这是禁止的。 我知道基本上不可能肯定地回答为什么某事以某种方式完成。相反,我想询问可能导致此决定的原因。合格和不合格的枚举常量(或者一般来说可能是符号)有什么不同?如果编译器仍然允许这样做会出现什么问题?

虽然关于如何修复编译器错误本身存在很多问题,但似乎没有人解决上述问题。

【问题讨论】:

  • 编译器知道它根据MyEnum 枚举选择一个案例,因此无需完全限定常量。错误消息的措辞可能会更好一些。
  • @MuratKaragöz 那个答案并没有解释为什么不能的决定(只是技术上为什么不能)。
  • 相关:12
  • @Sweeper 这里存在一个不启用该功能(限定常量)的技术原因,并在我的回答中进行了解释。我正在回答显示这样做的成本(这是客观的)。你真的不认为人们了解这个他们可能经常想知道的概念是有用的吗?
  • @josejuan 我从来没有说过没有技术原因,也从来没有说过学习这个概念没有用。我的意思是这个问题问得不好。我引用:“'为什么'问题的根本问题不在于答案是一种意见。根本问题是不可能知道什么会让提出问题的人满意,因为问题很模糊”

标签: java enums compilation qualified-name unqualified-name


【解决方案1】:

真正的枚举类型被定义到switch 语句中,对于每个case 子句,编译器只需检查该枚举中存在的文字。

如果您允许在case 子句中指定限定符(完全限定符等),那么编译器必须执行无用的步骤(检查符号是否是给定枚举的成员)。

这就是为什么说不等于不一样的原因(乍一看可能是这样)。

从技术上讲,限制是回复here 并解释here

【讨论】:

  • 谢谢。因此得出结论:没有技术限制,但这将是尚未采取的额外规范和实施步骤。
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2016-10-01
相关资源
最近更新 更多