This question already has answers here:
Java enum- Cannot reference a field before it is defined

(8个答案)


3年前关闭。




想象以下组成的示例:
public enum Hand {
  ROCK(SCISSORS),
  PAPER(ROCK),
  SCISSORS(PAPER);

  private final Hand beats;

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

我将收到一个错误Illegal forward reference,以向前引用SCISSORS

有没有办法处理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

10-07 19:09
查看更多