переключатели, вызывающие один и тот же случай несколько раз - PullRequest
1 голос
/ 24 ноября 2011

Я хотел бы написать некоторый код в 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 ]

3 голосов
/ 24 ноября 2011

Я бы начал с разбиения вашего псевдо-переключателя на реальные переключатели:

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
}

Это должно соответствовать вашим требованиям.

Затем я извлеку каждый блок переключателей в своем собственном методе, чтобы его было легче понять и прочитать.

Вы могли бы рассмотреть возможность извлечения всего этого в небольшую классовую иерархию:

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 голос
/ 24 ноября 2011

Коммутатор не подходит для этого, вам нужно будет выполнить проверки с некоторыми операторами if-else (или несколькими отдельными операторами переключателя, как сказал Питер).

С JLS :

Никакие два выражения константы регистра, связанные с оператором switch, не могут иметь одинаковое значение.

1 голос
/ 24 ноября 2011

Вы можете сделать это с помощью нескольких операторов switch. При использовании break; в любом случае выпадает блок переключателей.

...