Java 开关箱分组箱

Java 开关箱分组箱,java,switch-statement,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

如果我们以该代码为例:

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


谢谢

简单的答案是编译器很愚蠢:)

在第一个代码段中,生成的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;
    }
}

简单的答案是编译器很愚蠢:)

在第一个代码段中,生成的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;
    }
}

在第一部分中,执行将在break语句之后从switch语句中出来,而在第二部分中,程序将继续执行到最后一种情况


因此,对于第一部分,值是否为0、2、4。。。。或者,无论任务是什么,都将执行nbdays=31,并且nbdays=30将执行1、3、5。。。。基本上,这是一种最小化为多个类似语句编写代码的方法。

在第一部分中,执行将在break语句之后从switch语句中出来,而在第二部分中,程序将继续执行到最后一种情况


因此,对于第一部分,值是否为0、2、4。。。。或者,无论任务是什么,都将执行nbdays=31,并且nbdays=30将执行1、3、5。。。。基本上,这是一种最小化为多个类似语句编写代码的方法。

对于
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()

如果开关值为9,则仅执行oct()和dec()

明白我说的不分组是什么意思吗? 就像if、while和for一样,switch语句是避免
goto
语句的一种方法。 我们习惯性地将它们用作地图、分组或其他任何东西,但这不是它们的字面意思。它们的字面意思是:从案例匹配的地方开始,然后在中断/继续/返回/抛出时退出。从一个案例持续到下一个案例的过程称为“跌破”


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

对于
开关
语句,没有分组。
考虑这个任意的例子:

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()

如果开关值为9,则仅执行oct()和dec()

明白我说的不分组是什么意思吗? 就像if、while和for一样,switch语句是避免
goto
语句的一种方法。 我们习惯性地将它们用作地图、分组或其他任何东西,但这不是它们的字面意思。它们的字面意思是:从案例匹配的地方开始,然后在中断/继续/返回/抛出时退出。从一个案例持续到下一个案例的过程称为“跌破”


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

等待。。。您知道可以使用带有枚举值的switch语句,对吗?@fge:这些不是枚举,它们是
static int
s(如果您谈论的是
Calendar.janur
等)。@fge是的,但这甚至不是我的问题,我只是不明白分组是怎么回事works@T.J.Crowder我的意思是使用
一月
等作为值
开关
语句做的事情不同。如果你从一个案例中省略了
break
,那么它就会进入下一个案例。等等。。。您知道可以使用带有枚举值的switch语句,对吗?@fge:这些不是枚举,它们是
static int
s(如果您谈论的是
Calendar.janur
等)。@fge是的,但这甚至不是我的问题,我只是不明白分组是怎么回事works@T.J.Crowder我的意思是使用
一月
等作为值
开关
语句做的事情不同。如果你在一个案例中省略了
break
,那么它就会进入下一个案例。事实上,我忘了在代码的第二部分添加break语句。感谢您花时间为我解释。另外,我正在寻找一种优化切换案例的方法,您为meGlad做了这件事,我可以提供帮助:)但是,请注意,
Calendar
已经是JRE中一个类的名称(
java.util.Calendar
)。如果我是你,我会用另一个名字;)事实上,我忘了在代码的第二部分添加break语句。感谢您花时间为我解释。另外,我正在寻找一种优化切换案例的方法,您为meGlad做了这件事,我可以提供帮助:)但是,请注意,
Calendar
已经是JRE中一个类的名称(
java.util.Calendar
)。如果我是你,我会用另一个名字;)你知道为什么有些人会用这种方法吗?你有什么想法吗