切换案例分组案例

时间:2017-08-30 14:21:14

标签: java switch-statement

如果我们以此代码为例:

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将如何根据月份检测案例并将其关联起来?

谢谢

3 个答案:

答案 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处退出。从一个案例继续到下一个案件的过程被称为"通过"

要保存一些代码,请将开关包装在方法中,而不是分配变量和断开,只需返回值并跳过中间变量。