交换机多次调用同一个案例

时间:2011-11-24 08:20:01

标签: java switch-statement

我想在java中编写一些代码,这些代码可以在交换机中或者多次调用同一个案例,使用的代码对于中间的大多数或所有情况都是相同的。现在我必须为每个案例重复一半的代码,因为它被区分大小写的代码所包围。我脑子里的代码看起来像这样,变量范围从0到3,break只是意味着停止执行直到下一次调用那个案例,我明白它可能是除了break之外的东西,如果它存在,

    switch(variable){
    case 0:
    case 1:
        if(other factors)
            //add item to next spot in array
    case 2:
    case 3://all cases
        //add items to next 3 spots in array for all cases
        break;
    case 0:
    case 1:
        if(other factors)
            //add item to next spot in array
    case 2:
    case 3://all cases
        //add more items to next spot in array
        break;
    case 1:
    case 2:
        if(other factors2)
            //add item to next spot in array
        break;
    case 3:
        //add item to next spot in array
    case 0:
    case 1:
    case 2://all cases
        //add items to next spot in array
        break;
    case 1:
    case 2:
        if(other factors2)
            //add item to next spot in array
        break;
    case 3:
        //add item to next spot in array
    }

3 个答案:

答案 0 :(得分:3)

我首先将你的伪开关拆分成真正的开关:

switch(variable){
case 0:
case 1:
    if(other factors)
        //add item to next spot in array
case 2:
case 3://all cases
    //add items to next 3 spots in array for all cases
}

switch(variable){
case 0:
case 1:
    if(other factors)
        //add item to next spot in array
case 2:
case 3://all cases
    //add more items to next spot in array
}

switch(variable){
case 1:
case 2:
    if(other factors2)
        //add item to next spot in array
    break;
case 3:
    //add item to next spot in array
case 0:

}

switch(variable){
case 1:
case 2://all cases
    //add items to next spot in array
    break;
case 1:
case 2:
    if(other factors2)
        //add item to next spot in array
}

这应该符合您的要求。

然后我会用自己的方法提取每个开关块,以便更容易理解和阅读。

您可以考虑将所有这些提取为一个小类hirachy:

class DefaultExecutor{
    void do(){
        step1();
        step2();
        step3();
        step4();
    }
    void step1(){//all cases class of the first switch statement}
    //... similar methods for the other switcht statements
}

class CaseZeor extends DefaultExecutor{
    // override step1-4 as required for special treatment of case 0
}

// ... further classes for cases 1-3

答案 1 :(得分:1)

您可以使用多个switch语句执行此操作。使用break;时,无论如何都会丢弃开关块。

答案 2 :(得分:1)

Switch不适合这种情况,您需要使用一些if-else语句(或Peter所说的某些单独的switch语句)执行检查。

来自JLS

  

与switch语句关联的两个case常量表达式中没有两个可能具有相同的值。