使用案例陈述

时间:2012-07-26 15:01:54

标签: java switch-statement

我使用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语句中间改变切换器的方法被放在那里用于响应。我不会这样做是我的计划。

8 个答案:

答案 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的中间。”