Java - 枚举 - 逻辑循环引用

JDC*_*JDC 3 java enums forward-reference circular-reference

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

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

  private final Hand beats;

  Hand(Hand beats) {
    this.beats = beats;
  }
}
Run Code Online (Sandbox Code Playgroud)

我将收到Illegal forward reference前向引用的错误SCISSORS.


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

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

Mr.*_*irl 7

您不能分配SCISSORSROCK被定义之前.相反,您可以在静态块中分配值.

我已经看到很多人在构造函数中使用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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

ROCK beats SCISSORS
PAPER beats ROCK
SCISSORS beats PAPER
Run Code Online (Sandbox Code Playgroud)

  • 为什么要投票呢?它实际上对我来说很好 (2认同)