枚举的详尽 switch 语句的静态分析 [重复]
Posted
技术标签:
【中文标题】枚举的详尽 switch 语句的静态分析 [重复]【英文标题】:Static analysis of exhaustive switch statements of enums [duplicate] 【发布时间】:2018-05-30 14:55:56 【问题描述】:考虑以下代码:
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 语句之后的代码块是不可达的?
我尝试查看language spec,但我没有看到清楚地解决这一点。
【问题讨论】:
然后一位开发人员决定将D
添加到MyEnum
,这会导致20 个不相关的类不再编译,因为它们都有没有默认大小写的开关。
@JaroslawPawlak 因为测试,这不是问题。
@vincrichaud 是的,看起来这是个骗子。谢谢指点。
@JaroslawPawlak 哦,我更喜欢那 20 个不相关的类被证明是错误的,
【参考方案1】:
嗯,Java 并不像 C/C++ 或 .NET 等其他语言那样本机实现枚举。它们只是(最终)类的实例。因此,实际上您的运算符 ==
比较的是 reference 相等性,而不是您可能建议的整数值。
这就是switch语句不完整的原因。引用可能只是null
。
此外,您可能已经使用公共构造函数定义了自己的枚举类,该构造函数可以创建任意数量的实例。
顺便说一句:实现foo
方法的最简单的方法是
int foo(MyEnum e)
return e.ordinal() + 1;
但请注意,.ordinal()
不会返回与您的枚举常量相关的任何值。它只是按定义顺序排列的索引。
【讨论】:
规范明确指出,switch 将在输入时抛出 NPE,尽管这不是一个检查异常:“当 switch 语句执行时,首先计算表达式。如果表达式计算为 null,抛出 NullPointerException 并且整个 switch 语句因此突然完成。" 对不起,我不清楚,但我并没有试图实现这个确切的例子。这只是一个简单的例子来说明我在说什么。假设你总是返回其他方法调用的结果。以上是关于枚举的详尽 switch 语句的静态分析 [重复]的主要内容,如果未能解决你的问题,请参考以下文章