【问题标题】:No. of variables in a switch statement - Javaswitch 语句中的变量数 - Java
【发布时间】:2011-06-25 05:46:06
【问题描述】:

您能否在 Java 中的 switch 语句中包含多个变量?

enum Facing { North, South, East, West }

enum Forward { Right, Left }

Forward forward;

Facing facing;

Integer myNumber;

所以它看起来像这样?如果是这样,我将如何实施

switch (facing, forward) {
  case North, Right : facing 1 = East
}

我知道这是错误的,但想知道这种技术是否可行,我将如何实施?

【问题讨论】:

  • swicth 语句只能切换原始类型和枚举。那么为什么不将所有枚举转换为单个数字而不是切换呢?

标签: java switch-statement enumeration enumerated-types


【解决方案1】:

Eng.Fouad 提供了一种解决方法。

另一种选择可能是创建一个更复杂的 Facing 枚举,如下所示:

enum Facing {
  North {
    Facing right() { return East; }
    Facing left() { return West; }
  },
  East {
    Facing right() { return South; }
    Facing left() { return North; }
  },
  South {
    Facing right() { return West; }
    Facing left() { return East; }
  },
  West {
    Facing right() { return North; }
    Facing left() { return South; }
  };
  abstract Facing right();
  abstract Facing left();
}

这样的结构还允许轻松链接,以便您可以编写一个通用的反向例程,如下所示:

Facing reverse(Facing facing) { return facing.right().right(); }

【讨论】:

    【解决方案2】:

    你可以这样做:

    switch(facing)
    {
        case North:
             switch(forward)
             {
                  case Right: // blah blah
                  break;
             }
        break;
    }
    

    【讨论】:

    • 这就是这样做的方法。您甚至可以删除一些新行,将代码全部放在一行中,使其更具可读性和简洁性。但是,如果使用此解决方案,请不要忘记将 break 放在所有正确的位置,因为所有排列都会很快失控。
    • 是的,这行得通,但是 if 语句在这里看起来会更好更简单吗? if (facing == North && forward == Right) {...} else if (...)
    【解决方案3】:

    这似乎属于Facing:

    enum Facing {
    
        North, East, South, West;
    
        public Facing turn(Forward f) {
            return values()[(ordinal() + (f == Forward.Right ? 1 : 3)) % 4];
        }
    }
    

    【讨论】:

      【解决方案4】:

      JDK 7 开始,你可以用一个字符串上的开关来模拟这个:

      Facing facing = Facing.North;
      Forward forward = Forward.Right;
      
      String facingForward = facing + "-" + forward;
      switch(facingForward){
          case "North-Right": return East;
          ..
      }
      

      【讨论】:

        【解决方案5】:

        实际上,您正在对一组状态转换进行建模,当您处于特定状态(例如面向北方)时,某些动作(例如顺时针 90 转)会导致一个新状态(面向东方)

        您可以使用大量嵌套的 switch 语句或类似的东西对此类事物进行建模。我认为您可能最好将状态实际建模为显式类,也许从定义动作的抽象基类派生。

        我怀疑如果你的状态或动作变得稍微复杂一点,你会发现你需要这些类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-19
          • 2021-08-11
          • 2011-12-19
          • 1970-01-01
          相关资源
          最近更新 更多