public enum Hand {
ROCK(SCISSORS),
PAPER(ROCK),
SCISSORS(PAPER);
private final Hand beats;
Hand(Hand beats) {
this.beats = beats;
}
}
我将得到错误的非法前向引用,用于前向引用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
标签:circular-reference,java,enums,forward-reference
来源: https://codeday.me/bug/20190823/1702021.html