Альтернатива вложенным операторам 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;
          }
}

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

мы можем рассмотреть возможность использования 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
//
}