Java - 枚举 - 逻辑循环引用

Java - Enums - Logical circular reference

想象一下下面的例子:

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

  private final Hand beats;

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

前向引用 SCISSORS 我会得到一个错误 Illegal forward reference


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

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

您不能在 SCISSORS 定义之前将其分配给 ROCK。相反,您可以在静态块中分配值。

我见过很多在构造函数中使用 String 值的示例,但在声明实际值后分配实际值更为具体。这个是封装好的,beats实例变量不能改(除非你用反射)。

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