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
想象一下下面的例子:
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