unj*_*nj2 92 java language-design case break switch-statement
为什么编译器不会在交换机中的每个代码块之后自动放置break语句?这是出于历史原因吗?您何时需要执行多个代码块?
Wil*_*ean 93
有时,将多个案例与相同的代码块相关联是有帮助的,例如
case 'A':
case 'B':
case 'C':
doSomething();
break;
case 'D':
case 'E':
doSomethingElse();
break;
Run Code Online (Sandbox Code Playgroud)
等等只是一个例子.
根据我的经验,通常情况下"糟透了"并且在一个案例中执行多个代码块是不好的风格,但在某些情况下可能会有用途.
Rom*_*eau 29
Java来自C,这是来自C的语法.
有时您希望多个case语句只有一个执行路径.以下是一个示例,它将告诉您一个月中的天数.
class SwitchDemo2 {
public static void main(String[] args) {
int month = 2;
int year = 2000;
int numDays = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if ( ((year % 4 == 0) && !(year % 100 == 0))
|| (year % 400 == 0) )
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}
System.out.println("Number of Days = " + numDays);
}
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*olk 14
我认为这是一个错误.作为一种语言结构,它break
与默认语言一样容易,而是有一个fallthrough
关键字.我编写和阅读的大多数代码在每个案例后都有一个中断.
Zac*_*son 13
案例落后你可以做各种有趣的事情.
例如,假设您想要针对所有情况执行特定操作,但在某些情况下,您希望执行该操作以及其他操作.使用带有连接的switch语句会非常容易.
switch (someValue)
{
case extendedActionValue:
// do extended action here, falls through to normal action
case normalActionValue:
case otherNormalActionValue:
// do normal action here
break;
}
Run Code Online (Sandbox Code Playgroud)
当然,很容易忘记break
案件结尾处的陈述并导致意外行为.当你省略break语句时,好的编译器会警告你.
在break
切换之后case
s的使用,以避免在开关语句下通。虽然有趣的是,这现在可以通过JEP-325实现的新形成的开关标签来实现。
通过这些更改,可以避免break
使用每个开关,case
如下所示:-
public class SwitchExpressionsNoFallThrough {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int value = scanner.nextInt();
/*
* Before JEP-325
*/
switch (value) {
case 1:
System.out.println("one");
case 2:
System.out.println("two");
default:
System.out.println("many");
}
/*
* After JEP-325
*/
switch (value) {
case 1 ->System.out.println("one");
case 2 ->System.out.println("two");
default ->System.out.println("many");
}
}
}
Run Code Online (Sandbox Code Playgroud)
在使用 JDK-12 执行上述代码时,比较输出可以看作是
//input
1
// output from the implementation before JEP-325
one
two
many
// output from the implementation after JEP-325
one
Run Code Online (Sandbox Code Playgroud)
和
//input
2
// output from the implementation before JEP-325
two
many
// output from the implementation after JEP-325
two
Run Code Online (Sandbox Code Playgroud)
当然,事情没有改变
// input
3
many // default case match
many // branches to 'default' as well
Run Code Online (Sandbox Code Playgroud)