2011-12-02 2 views
2

У меня есть большой список Ifs, и я хочу изменить его в оператор switch. В настоящее время это выглядит следующим образом:Несколько значений в case switch/преобразование ifs в оператор switch

if(x == 1){ 
    ... 
} 
if(x == 2){ 
    ... 
} 
if(myArray.contains(x)){ 
    ... 
} 

В действительности это немного больше, чем это, но это третий, если в примере, путает меня - как я могу изменить, что вокруг, чтобы заставить его работать в коммутаторе, или это даже возможно?

ответ

17

Вы могли бы сделать что-то подобное, но YMMV в соответствии с возможными условиями выхода в вашем коде:

switch (x) { 
case 1: 
    ... 
    break; 
case 2: 
    ... 
    break; 
case 3: 
case 4: 
    ... multi-case 
    break; 
default: 
    if(myArray.contains(x)){ 
    ... 
    } 
} 
+1

Это также немного отличается: переключатель/случай является '' if' ... еще if'. В siutation, где x изменяется в «then» блочном выражении, общее поведение будет другим. – rds

+3

В отличие от первых двух ifs в вопросе, третий может быть правдой, даже если одно из предыдущих также верно. 'x' не может быть равным' 1' AND '2' одновременно, но он может быть равен' 1' и содержится в 'myArray' в одно и то же время. Перемещение оператора if в операторы 'case'' default' скорее всего не является правильным решением. –

+0

Извините, я должен был уточнить - значения в массиве никогда не будут соответствовать чему-либо еще, что я проверяю, поэтому это не проблема. Хороший улов. – Steve

1

Вы можете перемещаться только по значению x. Это означает, что последнее условие не будет частью переключателя:

switch(x) { 
case 1: 
    ... 
    break; 
case 2: 
    ... 
    break; 
} 
if(myArray.contains(x)){ 
    ... 
} 
1

Да, это возможно , Оператор switch сделает его немного чище и проще в обслуживании. Вы должны беспокоиться о x, потому что она должна быть постоянной времени компиляции.

switch(x) { 
case 1: 
    doSomething(); 
    break(); 
case 2: 
    doSomethingElse(); 
    break(); 

default: 
if(myArray.contains(x)){ 

} 


//etc... 
} 
0

Это не выглядит очень объектно-ориентированным.

Попробуйте реорганизовать код с «Заменить условную с полиморфизмом» http://martinfowler.com/refactoring/catalog/replaceConditionalWithPolymorphism.html

Карта может помочь вам сделать некоторую Lookups, если вам нужно конвертировать из INT в пользовательские объекты.

3

переключателя заявление может быть использовано только для проверки равенства х

Так что если not equality conditions как (if(myArray.contains(x))) должен прийти в конце, то вы можете скопировать вставить эту информацию в раздел переключателя по умолчанию

Это будет выглядеть таким образом

switch (x) { 
    case 1: ...; break; 
    case 2: ...; break; 
    default: if(myArray.contains(x)) ... 
    } 

Если not equality conditions должны быть в середине, то его нельзя использовать переключатель.

ссылка: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

+0

+1. Очень хороший ответ. –

Смежные вопросы