Альтернатива вложенным операторам Switch в Java
поэтому я написал метод сегодня, который включал использование вложенных операторов switch, и код выглядел довольно чистым и кратким для меня, но мне сказали, что вложенные операторы switch обычно не лучший способ пойти, поскольку они могут запутаться с большим количеством операторов switch, которые вы добавляете. Вот пример того, как выглядел мой код:
EnumOne enumOne;
EnumTwo enumTwo = null;
EnumTwo enumThree = null;
switch (enumOne) {
case CASE_ONE:
switch (enumTwo){
case A: enumTwo = EnumTwo.B; break;
case C: enumTwo = EnumTwo.D; break;
default: break;
}
switch (enumThree) {
case AA: enumThree = EnumTwo.BB; break;
case CC: enumThree = EnumTwo.DD; break;
default: break;
}
break;
case CASE_TWO:
case CASE_THREE:
switch(EnumTwo) {
default: break;
}
switch (enumThree) {
case AA: enumThree = EnumTwo.XX; break;
case CC: enumThree = EnumTwo.YY; break;
default: break;
}
break;
default:
break;
}
таким образом, мой вопрос был бы, по существу, что было бы подходящей альтернативой этим операторам switch?
3 ответов
Я рекомендую вам заменить каждый вложенный оператор switch вызовом процедуры, которая затем выполняет вложенный код коммутатора.
написать что-то вроде этого:
EnumOne enumOne;
EnumTwo enumTwo = null;
EnumTwo enumThree = null;
switch (enumOne)
{
case CASE_ONE:
nested_switch1();
case CASE_TWO:
case CASE_THREE:
nested_switch2();
break;
default:
break;
}
nested_switch1() {
switch (enumTwo)
{
case A:
enumTwo = EnumTwo.B;
break;
case C:
enumTwo = EnumTwo.D;
break;
default:
break;
}
switch (enumThree)
{
case AA:
enumTwo = EnumTwo.BB;
break;
case CC:
enumTwo = EnumTwo.DD;
break;
default:
break;
}
break;
}
nested_switch2() {
switch(EnumTwo)
{
default:
break;
}
switch (enumThree)
{
case AA:
enumTwo = EnumTwo.XX;
break;
case CC:
enumTwo = EnumTwo.YY;
break;
default:
break;
}
}
- как много становится довольно трудно читать.
- и каждый раз, когда возникает новый случай, мы должны изменить код и добавить случай
мы можем рассмотреть возможность использования polymorphism
в таких случаях
Я собираюсь дать простой класс, чтобы вы поняли. Предположим, что класс ранее с switch case
class Test
{
Animal a;
public Test(Animal a)
{
this.a=a;
}
public moveThisAnimal()
{
switch(this.a)
{
case fish:
System.out.println("swim");
break;
case dog:
System.out.println("walk");
break;
case bird:
System.out.println("fly");
break;
}
}
}
теперь мы заменим этот переключатель нашей логикой полиморфизма
Interface Animal
{
String move();
}
Class Dog implements Animal
{
public String move()
{
return "walk";
}
}
Class Bird implements Animal
{
public String move()
{
return "fly";
}
}
Class Fish implements Animal
{
public String move()
{
return "swim";
}
}
теперь у нас есть тестовый класс без случая переключателя
class Test
{
Animal a;
public Test(Animal a)
{
this.a=a;
}
public moveThisAnimal()
{
System.out.println(this.a.move()); // all switch case statements removed
}
}
и даже если нам нужно добавить дополнительные случаи, мы должны просто добавить реализации без изменений здесь
Смотрите полный код и посмотреть, если это возможно сделать
Если у вас есть целые числа X и Y, и вам нужно включить оба, вы можете объединить их каким-то однозначным образом и включить комбинацию. Например, если y
switch (x*10+y)
{
case 0: // x == y == 0
case 1: // x ==0, y == 1
///
case 10: // x == 1, y == 0
case 11: // x == y == 1
//
}