java - 枚举穷举switch语句的静态分析
问题描述
考虑以下代码:
enum MyEnum {
A, B, C;
}
int foo(MyEnum e) {
switch (e) {
case A:
return 1;
case B:
return 2;
case C:
return 3;
}
}
^ error: missing return statement
编译器不喜欢这样。将此示例与以下内容进行对比:
int bar() {
if (...) {
return 1;
} else {
return 2;
}
}
开关的问题可以通过一个default
案例来解决,但你可以争辩说这里不需要。所有枚举值都包含在 switch 的情况下。switch 语句的静态分析是否知道,在穷举 switch 中返回时,switch 语句之后的代码块是不可达的?
我尝试查看语言规范,但我没有清楚地看到这一点。
解决方案
好吧,Java 并不像 C/C++ 或 .NET 等其他语言那样本机实现枚举。它们只是(最终)类的实例。因此,实际上您的运算符会==
比较引用相等性,而不是您可能建议的整数值。
这就是为什么 switch 语句不完整的原因。参考可能只是null
.
此外,您可能已经使用公共构造函数定义了自己的枚举类,该构造函数可以创建任意数量的实例。
顺便说一句:实现您的方法的最简单的foo
方法是
int foo(MyEnum e)
{ return e.ordinal() + 1;
}
但请注意,.ordinal()
它不会返回与您的枚举常量相关的任何值。它只是按定义顺序排列的索引。
推荐阅读
- php - 关于 Github 文件上传问题的 Codeigniter 项目
- bash - 将远程主机的 < /dev/null 结果保存到文本文件中的本地计算机
- android - 如何在 android 中保存函数调用并在以后再次使用它 Android
- android - SharedPreferences 在 ValueEventListener 中放入空值
- python - python中的组合列表理解
- docusignapi - DocuSign PHP:包含多个文档的信封
- string - BASH:试图在另一行继续一个字符串而不引入空格
- jquery - Asp.net:FullCalendar 不加载事件
- linux - C ++串行通信读取数据有效但写入失败
- jquery-select2 - 如何重置 select2 中的 allowClear 选项?