【问题标题】:Java - Enums - Logical circular reference [duplicate]Java - 枚举 - 逻辑循环引用
【发布时间】:2017-05-05 16:16:50
【问题描述】:

想象以下组成的例子:

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

  private final Hand beats;

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

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


有没有办法在 Java 中处理这种前向引用?

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

【问题讨论】:

  • 哪个错误?请说明
  • 更新了Illegal forward reference错误信息。
  • 您可以在方法中使用switch
  • 我实际上收回了它。这是重复的......来自谷歌搜索“在定义之前无法引用字段”的第一个结果

标签: java enums circular-reference forward-reference


【解决方案1】:

在定义之前,您不能将 SCISSORS 分配给 ROCK。相反,您可以在静态块中分配值。

我已经看到很多人们在构造函数中使用字符串值的例子,但是在声明它们之后分配实际值更具体。这是封装的,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

【讨论】:

  • 为什么不赞成这个?它实际上对我来说看起来不错
  • 由于beats 字段上的final 修饰符,编辑前的代码不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2013-04-28
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多