我使用int []数组作为参考。我想知道我对案例陈述的使用是否合理,或者是否会导致错误。
这是我的代码:
int switcheroo = intarray[0];
int foo = intarray[1];
boolean size = false;
boolean biggersize = false;
switch (switcheroo) {
case 0:
switch (foo) {
case 1:
doSomething(switcheroo); //change switcheroo somehow.
break;
case 2:
doSomethingElse(switcheroo); //change switcheroo differently.
break;
}
case 1:
size = true;
break;
case 2:
biggersize = true;
break;
default:
break;
}
除非这是巧合,否则我正在努力将嵌套案例陈述中的变化转变为其他案例,如我所愿。
我的问题是:
这种嵌套是否会引起进一步的麻烦?
缺乏休息;一个案例不好的做法?
感谢。
编辑:在switch语句中间改变切换器的方法被放在那里用于响应。我不会这样做是我的计划。
答案 0 :(得分:8)
嵌套不会严重影响线路故障,但阅读起来可能会让人感到困惑。添加评论和/或其他文档将真正帮助未来的编码人员(以及一周之内的自己!)通过查看来理解这一点。
缺乏休息本身并不是一种糟糕的做法,但它是大多数情况下的陈述,所以我会在最后添加评论,如// no break, allow fall-through
。
所以这两种情况归结为良好的文档。
这些观点与我认为这段代码不符合您认为会做的事实是完全相同的。
每次遇到case
子句时都不会重新声明它们 - 它们只是跳转到切换点。因此,在您的示例中,如果您从case 1
开始,始终将在case 0
结束 - 您永远不会从case 2
case 0
结束}。
如果我要对此进行重组,这就是我要做的。我会使用int
:
enum
enum Foo { GOOD_FOO, BAD_FOO }
enum Switcharoo { BAR, BAZ, BAQ, ESCAPE }
enum Size { NONE, REGULAR, BIGGER }
Foo foo = ... // assigned somewhere
Switcharoo roo = ... // assigned somewhere
Size size = NONE;
// use a while loop to reevalulate roo with each pass
while(roo != Switcharoo.ESCAPE) {
switch(roo){
case BAR:
switch(foo) {
case GOOD_FOO: foo = doSomething(foo); break;
case BAD_FOO: foo = doSomethingElse(foo); break;
}
break;
case BAZ:
roo = Switcharoo.ESCAPE;
size = Size.REGULAR;
break;
case BAQ:
roo = Switcharoo.ESCAPE;
size = Size.BIGGER;
break;
}
}
答案 1 :(得分:1)
RE:缺少休息时间;一个案例不好的做法?
如果在每个case语句后没有包含break,则流程将继续通过下一个语句,因此将执行多个选项的代码。
来自Java教程:
另一个兴趣点是break语句。每个休息声明 终止封闭的switch语句。控制流程继续 切换块后面的第一个语句。休息声明 是必要的,因为没有它们,开关块中的语句就会掉落 through:匹配的case标签之后的所有语句都在执行中 顺序,不管后续案例标签的表达, 直到遇到break语句。
检查http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html以了解有关切换语句的更多详细信息。
答案 2 :(得分:1)
如果foo
既不是1也不是2,那么切换器应该继续case 1
吗?如果是,您的代码是正确的。如果没有,则需要在case 1
答案 3 :(得分:0)
switch
运算符是一种条件if
运算符。并且一堆if运算符可能会报告您需要在代码中涉及对象多态,而不是使用sequental if-switch运算符。
考虑将数据重新安排到类/对象并使用多态方法处理它们。它将使您的代码更可靠,更易于管理,更美观。
答案 4 :(得分:0)
我不确定我是否理解你的第一个问题,你能给我一些更多信息(具体可能)吗?
关于第二个问题,在案例之后没有break语句没有错,只要你知道代码将继续执行直到找到break语句。
答案 5 :(得分:0)
如果只有2个替代品,则更喜欢if / else。代码行少,没有break
问题。
这种嵌套是否会引起进一步的麻烦?
问题是这样的交换机嵌套很难阅读:在我注意到你使用的是嵌套交换机之前,我必须查看代码两次。这可能是一个维护问题,但这不是不使用嵌套交换机的原因,只需使用此谨慎,调整缩进以澄清正在发生的事情,并评论用法。
缺乏休息;一个案例不好的做法?
省略break
而导致维护/调试问题,但我不认为这是不好的做法。毕竟,它是switch
陈述的设计中固有的。我们总是欢迎堕落评论,以便下一个人 - 或者您在几个月后重新访问您的代码 - 知道堕落是故意的。
答案 6 :(得分:0)
Is the lack of a break; after a case bad practice?
不错,避免不正常行为是一种好习惯。您的代码将在此休息时间内继续执行到您的最后一个案例。
在你的第一个外壳中添加休息。
答案 7 :(得分:0)
我建议避免嵌套和穿透组合。至少在个人方面,我倾向于期望每个case
都以break
结尾,所以我只会在很容易发现的情况下使用fallthrough,并且导致代码比{{1}更清晰例如:
if..else
也就是说,使用空的或非常简单的(一个语句)switch (foo) {
case 0:
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
default:
break;
}
个体。在您的情况下,将第一个case
的主体重构为方法可能会起作用:
case
(这主要是可读性和风格。交换机的含义仍然是“如果切换器为void changeSwitcheroo(int foo, int switcheroo) {
switch (foo) {
case 1:
doSomething(switcheroo); //change switcheroo somehow.
break;
case 2:
doSomethingElse(switcheroo); //change switcheroo differently.
break;
}
}
// ...
int switcheroo = intarray[0];
int foo = intarray[1];
switch (switcheroo) {
case 0:
changeSwitcheroo(foo, switcheroo);
case 1:
size = true;
break;
case 2:
biggersize = true;
break;
default:
break;
}
,则跳转到案例1
的中间。”