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
)。如果我是你,我会用另一个名字;)你知道为什么有些人会用这种方法吗?你有什么想法吗