Java Ссылка Enum на другой Enum - PullRequest
4 голосов
/ 24 февраля 2020

Я бы хотел, чтобы в Java был перечислитель с другим перечислением в качестве атрибута.

public enum Direction {
    Up(Down),
    Down(Up),
    Left(Right),
    Right(Left);

    private Direction opposite;

    Direction(Direction opposite){
        this.opposite = opposite;
    }
}

Итак, у меня другое направление, и для каждого я хочу знать обратное. Это работает нормально для Вниз и Вправо, но я не могу инициализировать Вверх, потому что Вниз еще не известен (тот же форт Влево).

Как я могу редактировать перечисляемые переменные после инициализации?

Ответы [ 4 ]

6 голосов
/ 24 февраля 2020

Поместите вашу инициализацию в блок * stati c:

public enum Direction {
    Up, Down, Left, Right;

    private Direction opposite;

    static {
        Up.setDirection(Down);
        Down.setDirection(Up);
        Left.setDirection(Right);
        Right.setDirection(Left);
    }

    private void setDirection(Direction opposite) {
        this.opposite = opposite;
    }

    public String toString() {
        return this.name() + " (" + opposite.name() + ")";
    }
}
5 голосов
/ 24 февраля 2020

Одно из возможных решений - вы можете инкапсулировать этот логин в методе

public Direction getOpposite() {
   switch (this) {
      case Up:
         return Down;
      case Down:
         return Up;
      case Left:
         return Right;
      case Right:
         return Left;
   }
   return null;
}

Это будет тот же интерфейс для классов, которые будут использовать это перечисление

4 голосов
/ 24 февраля 2020

Быстрое и грязное решение, поместите инициализацию в блок static:

public enum Direction {
  Up,
  Down,
  Left,
  Right;

private Direction opposite;

public Direction opposite() {
    return this.opposite;
}

static {
    Up.opposite = Down;
    Down.opposite = Up;
    Left.opposite = Right;
    Right.opposite = Left;
  }
}
2 голосов
/ 24 февраля 2020

Один трюк состоит в том, чтобы оставить аргументы как null s:

enum Direction {
    Up(null),
    Down(Up),
    Left(null),
    Right(Left);

и установить "противоположность противоположности" в this в конструкторе:

Direction(Direction opposite){
    this.opposite = opposite;
    if (opposite != null) {
        opposite.opposite = this;
    }
}

Но это всего лишь трюк. Я не думаю, что это красивый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...