Java枚举链接到另一个枚举

Java枚举链接到另一个枚举,java,enums,Java,Enums,我希望Java中的枚举器具有其他枚举作为属性 public enum Direction { Up(Down), Down(Up), Left(Right), Right(Left); private Direction opposite; Direction(Direction opposite){ this.opposite = opposite; } } 所以我有不同的方向,对于每个方向,我想知道相反的方向。 它

我希望Java中的枚举器具有其他枚举作为属性

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

    private Direction opposite;

    Direction(Direction opposite){
        this.opposite = opposite;
    }
}
所以我有不同的方向,对于每个方向,我想知道相反的方向。 它在向下和向右运行都很好,但我不能初始化向上,因为向下还不知道(左边是同一个堡垒)


初始化后如何编辑枚举变量?

将初始化放在静态块中:

公共枚举方向{
上、下、左、右;
私人方向相反;
静止的{
向上。设置方向(向下);
向下。设置方向(向上);
左。设置方向(右);
右。设置方向(左);
}
专用方向(方向相反){
这个。相反的=相反的;
}
公共字符串toString(){
返回此.name()+”(“+相反的.name()+”);
}
}

快速而肮脏的解决方案,将初始化放在
静态
块中:

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

一个技巧是将参数保留为
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;
    }
}

但这仅仅是一个骗局。我认为这不是一个好看的代码。

可能的解决方案之一-您可以将此登录封装在方法中

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

对于将使用此枚举的类,它将是相同的接口。setDirection的名称有误导性。设置相反方向或设置相反方向会更好。