让我们看一个简单的 switch-case,如下所示:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.someValue :
case R.id.someOtherValue:
// do stuff
break;
}
}
我想知道为什么不允许使用 ||
运算符?喜欢
switch (v.getId()) {
case R.id.someValue || R.id.someOtherValue:
// do stuff
break;
}
switch-case
结构与 if-else
语句非常相似,但是您可以在 if
中使用 OR 运算符。 switch-case
不接受这个运营商的背景是什么?
原文由 Droidman 发布,翻译遵循 CC BY-SA 4.0 许可协议
因为
case
需要常量表达式作为它的值。并且由于||
表达式不是编译时间常数,因此是不允许的。从 JLS 第 14.11 节:
开关标签应具有以下语法:
引擎盖下:
可以从 JVM Spec 第 3.10 节 - 编译开关 中了解仅允许使用 case 进行常量表达式的原因:
因此,对于
tableswitch
使用的 case 标签作为目标偏移表的索引,case 的值应该在编译时知道。这只有在 case 值是一个常量表达式时才有可能。并且||
表达式将在运行时进行评估,并且该值仅在那时可用。从同一 JVM 部分,以下
switch-case
:编译为:
因此,如果
case
值不是常量表达式,编译器将无法使用tableswitch
指令将其索引到指令指针表中。