如果我们以此代码为例:
switch (PeriodEnum.getEnum(month).getValue()) {
case 0: // Calendar.JANUARY
case 2: // Calendar.MARCH
case 4: // Calendar.MAY
case 6: // Calendar.JULY
case 7: // Calendar.AUGUST
case 9: // Calendar.OCTOBER
case 11: // Calendar.DECEMBER
nbDays = 31;
break;
case 3: // Calendar.APRIL
case 5: // Calendar.JUNE
case 8: // Calendar.SEPTEMBER
case 10: // Calendar.NOVEMBER
nbDays = 30;
break;
前面的代码和下面的代码有什么区别?
switch (PeriodEnum.getEnum(month).getValue()) {
case 0: // Calendar.JANUARY
nbDays = 30;
break;
case 2: // Calendar.MARCH
nbDays = 30;
break;
case 4: // Calendar.MAY
nbDays = 30;
break;
....
}
作为java的初学者,我很想了解其中的差异。我不明白的主要问题是IDE将如何根据月份检测案例并将其关联起来?
谢谢
答案 0 :(得分:0)
简单的答案是编译器是愚蠢的:)
在第一个代码片段中,生成的JVM代码将很乐意将您捆绑在一起的所有案例填充到同一个分支中,而在第二个代码段中,它同样会愉快地将每个案例填充到自己的分支中。即使一组分支完全相同,编译器也不关心并且不会为您做分析。
现在,在Java中还有其他需要考虑的事情,即枚举就像其他任何对象一样......这意味着它们可以拥有实例变量。因此,您可以这样做,并完全避免使用switch语句:
public enum Calendar
{
JANUARY(30),
FEBRUARY(28),
// etc etc
;
private final int daysInMonth;
Calendar(final int daysInMonth)
{
this.daysInMonth = daysInMonth;
}
public int getDaysInMonth()
{
return daysInMonth;
}
}
答案 1 :(得分:0)
在第一部分中,执行将在break语句之后的switch语句中执行,而在第二部分中,程序将一直持续到最后一个案例。
所以对于第一部分,值是0,2,4 ......还是任何赋值nbdays = 31将被执行而nbdays = 30将被执行1,3,5 ....基本上这是一种最小化多个类似语句的编写代码的方法。
答案 2 :(得分:0)
switch
语句没有分组。
考虑这个任意的例子:
switch (PeriodEnum.getEnum(month).getValue()) {
case 0: // Calendar.JANUARY
jan();
case 2: // Calendar.MARCH
mar();
case 4: // Calendar.MAY
may();
case 6: // Calendar.JULY
jul();
case 7: // Calendar.AUGUST
aug();
case 9: // Calendar.OCTOBER
oct();
case 11: // Calendar.DECEMBER
dec();
break;
如果开关值为0,则jan(),mar(),may(),jul(),aug(),oct()和dec()ALL执行。
如果开关值为9,则只执行oct()和dec()。
看看我的意思是不分组?
就像if,while和for,switch语句是避免goto
语句的一种方式。
我们习惯性地将它们用作地图,分组或其他任何东西,但这不是它们的字面意义。字面意思是:从案例匹配开始,然后在break / continue / return / throw处退出。从一个案例继续到下一个案件的过程被称为"通过"
要保存一些代码,请将开关包装在方法中,而不是分配变量和断开,只需返回值并跳过中间变量。