Java - 枚举 - 逻辑循环引用

时间:2016-12-20 12:33:21

标签: java enums circular-reference forward-reference

想象一下以下组成的例子:

public enum Hand {
  ROCK(SCISSORS),
  PAPER(ROCK),
  SCISSORS(PAPER);

  private final Hand beats;

  Hand(Hand beats) {
    this.beats = beats;
  }
}

我会因前向引用Illegal forward reference而收到错误SCISSORS

有没有办法在Java中处理这样的前向引用?

或者你会如何模拟这种情况,你在几个枚举值之间有一个逻辑循环引用?

1 个答案:

答案 0 :(得分:6)

在定义之前,您无法将ROCK分配给beats。相反,您可以在静态块中分配值。

我已经看到很多人在构造函数中使用String值的例子,但是在声明它们之后分配实际值更具体。这是封装的,public enum Hand { ROCK, PAPER, SCISSORS; private Hand beats; static { ROCK.beats = SCISSORS; PAPER.beats = ROCK; SCISSORS.beats = PAPER; } public Hand getBeats() { return beats; } public static void main(String[] args) { for (Hand hand : Hand.values()) { System.out.printf("%s beats %s%n", hand, hand.getBeats()); } } } 实例变量不能更改(除非你使用反射)。

ROCK beats SCISSORS
PAPER beats ROCK
SCISSORS beats PAPER

输出

{{1}}