This question already has answers here:
Java enum- Cannot reference a field before it is defined
(8个答案)
3年前关闭。
想象以下组成的示例:
我将收到一个错误
有没有办法处理Java中的此类前向引用?
或在多个枚举值之间有逻辑循环引用的情况下,如何建模?
输出量
(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