替代Java中的嵌套切换语句

时间:2013-04-10 16:12:46

标签: java nested switch-statement performance

所以我今天编写了一个方法,结合了嵌套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;
}

所以我的问题基本上是什么是这些转换语句的合适替代品?

3 个答案:

答案 0 :(得分:22)

  1. 因为使用大量的开关变得非常难以阅读。
  2. 每当出现新案例时,我们都必须修改代码并添加CASE
  3. 我们可以考虑在这种情况下使用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";
        }
    }
    

    现在我们有没有开关案例的Test类

    class Test
    { 
        Animal a;
        public Test(Animal a)
        { 
            this.a=a;
        }
        public moveThisAnimal()
        {
            System.out.println(this.a.move()); // all switch case statements removed 
        }
    }
    

    即使我们必须添加更多案例,我们也必须添加实现,而不是更改

    查看完整代码并查看是否可以执行

答案 1 :(得分:14)

我建议你用一个过程调用替换每个嵌套的switch语句,然后执行嵌套的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;
          }
}

答案 2 :(得分:5)

如果你有整数X和Y而你需要打开它们,你可以用一些明确的方式组合它们并打开组合。例如,如果y < 10:

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
//
}