首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中嵌套Switch语句的替代方案

Java中嵌套Switch语句的替代方案
EN

Stack Overflow用户
提问于 2013-04-11 00:12:46
回答 3查看 36.6K关注 0票数 20

所以我今天写了一个方法,结合了嵌套switch语句的使用,代码对我来说看起来相当干净简洁,但我被告知嵌套switch语句通常不是最好的方法,因为它们可能会与您添加的更多switch语句混淆。下面是我的代码样例:

代码语言:javascript
复制
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语句的合适替代方案?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-11 00:18:44

我建议您将每个嵌套的switch语句替换为对过程的调用,然后该过程将执行嵌套的switch代码。

改写这样的代码:

代码语言:javascript
复制
    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;
          }
}
票数 15
EN

Stack Overflow用户

发布于 2013-04-11 00:48:42

  1. 因为使用了大量的开关而变得相当难以阅读。
  2. 和任何时候出现新的案例时,我们都必须修改代码并添加一个案例

在这种情况下,我们可以考虑使用polymorphism

我将给出一个简单的类,只是为了让你们理解。假设前面有一个类,使用switch case

代码语言:javascript
复制
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;
        }
    }
}

现在我们用我们的多态逻辑替换这些开关

代码语言:javascript
复制
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类

代码语言:javascript
复制
class Test
{ 
    Animal a;
    public Test(Animal a)
    { 
        this.a=a;
    }
    public moveThisAnimal()
    {
        System.out.println(this.a.move()); // all switch case statements removed 
    }
}

即使我们必须添加更多的情况,我们也只能在这里添加实现,不做任何更改

查看您的完整代码,看看是否可以这样做

票数 24
EN

Stack Overflow用户

发布于 2013-04-11 09:01:44

如果你有整数X和Y,并且你需要同时打开这两个,你可以以某种明确的方式将它们组合在一起,然后打开这个组合。例如,如果y< 10:

代码语言:javascript
复制
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
//
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15931089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档