Java - 枚举类型 - 逻辑循环引用

3

想象以下虚构的例子:

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

  private final Hand beats;

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

当我前向引用SCISSORS时,会出现错误Illegal forward reference


在Java中有处理这种前向引用的方法吗?

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


哪个错误?请具体说明。 - ItamarG3
更新了 Illegal forward reference 错误信息。 - JDC
你可以在一个方法中使用 switch - Andy Turner
我撤回之前的说法。这是一个重复的问题...与在谷歌搜索“Cannot reference a field before it is defined”时得到的第一个结果相同。 - ItamarG3
我建议您阅读 http://brickydev.com/enum-circular-dependency-in-java/。 - oputyk
1个回答

10
你不能在定义 ROCK 之前将 SCISSORS 分配给它。相反,你可以在静态块中分配这些值。
我看到很多人在构造函数中使用字符串值的例子,但是这种方式更具体,可以在声明后分配实际值。这是封装的,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

2
为什么被踩了?我觉得它看起来很好啊。 - Tizianoreica
1
修改前的代码无法工作,因为beats字段上有final修饰符。 - JDC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接