Количество переменных в операторе switch - Java - PullRequest
4 голосов
/ 25 июня 2011

Можете ли вы включить более одной переменной в оператор switch в Java?

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
}

Я знаю, что это неправильно, но задавался вопросом, может ли такая техника работать и как бы я ее реализовал?

Ответы [ 5 ]

9 голосов
/ 25 июня 2011

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(); }
4 голосов
/ 25 июня 2011

Вы можете сделать так:

switch(facing)
{
    case North:
         switch(forward)
         {
              case Right: // blah blah
              break;
         }
    break;
}
2 голосов
/ 25 июня 2011

Начиная с JDK 7 , вы можете смоделировать это с помощью Switch on String:

Facing facing = Facing.North;
Forward forward = Forward.Right;

String facingForward = facing + "-" + forward;
switch(facingForward){
    case "North-Right": return East;
    ..
}
2 голосов
/ 25 июня 2011

Похоже, что это относится к Facing:

enum Facing {

    North, East, South, West;

    public Facing turn(Forward f) {
        return values()[(ordinal() + (f == Forward.Right ? 1 : 3)) % 4];
    }
}
0 голосов
/ 25 июня 2011

Фактически вы моделируете набор переходов между состояниями, когда вы находитесь в определенном состоянии (например, обращены к северу), в результате определенных действий (например, поворот на 90 ° по часовой стрелке) создается новое состояние (обращено на восток)

Вы можете моделировать такие вещи с помощью множества вложенных операторов switch или чего-то подобного. Я думаю, что вы можете лучше всего моделировать состояния как явные классы, возможно, производные от абстрактного базового класса, который определяет действия.

Я подозреваю, что если ваши состояния или действия станут немного более сложными, вы обнаружите, что вам нужны классы.

...