在日常实践中,Java 开发人员并不经常使用 switch 表达式。所以,我想,关于这种结构的知识不如“if-else”或“for”那么深。至少我的……我遇到了一个有趣的案例,想和你分享。让我们看一下代码:
int state = ...
...
List states = new ArrayList<>();
switch (state) {
case 0:
Integer newState = orderState + 1;
states.add(newState);
break;
case 1:
newState = orderState + 2;
states.add(newState);
break;
case 2:
newState = orderState + 3;
states.add(newState);
break;
default:
newState = orderState + 4;
states.add(newState);
}
你认为这段代码正确吗?或者它应该看起来像这样:
int state = ...
...
List states = new ArrayList<>();
switch (state) {
case 0:
Integer newState = orderState + 1;
states.add(newState);
break;
case 1:
newState = orderState + 2;
states.add(newState);
break;
case 2:
newState = orderState + 3;
states.add(newState);
break;
default:
newState = orderState + 4;
states.add(newState);
}
是否应该在每种
case
下都将
newState
声明为新变量?我的第一个意图是回答第一个变体是正确的。看起来很明显
switch
与
if-else
相同,但内部有更多
if
情况。所以我们会在每个条件分支中声明一个新变量。
但这是不正确的。您应该在 switch 表达式中声明一次变量,然后在所有
case
块中使用它。可以解释的很简单:每个
case
以
break
结尾,这会阻止处理所有后续的
case
,但
break
是可选的。如果没有
break
运算符,那么将执行第一种
case
下的所有运算符,然后执行第二种
case
下的所有运算符,依此类推。因此没有
break
,它是具有相同作用域的简单代码部分,所有运算符将在其中执行通常的顺序。
顺便提一下:
{
和
}
表示作用域的边界。 Switch 有一对
{}
,所以只有一个作用域,但是
if-else
可以有一对
{}
每个
if
和
else
。这就是为什么可以在
if
部分和
else
部分中声明相同的变量。