首页 > 解决方案 > 使用计算值创建枚举

问题描述

我使用以下代码并在计算枚举中的值时出错:

enum elPosition {
    p1(
            (boxX*0 + boxX/2),
            (boxY*0 + boxY/2)
    ),
    p2(
            (boxX*1 + boxX/2),
            (boxY*1 + boxY/2)
    ),
    p3(
            (boxX*2 + boxX/2),
            (boxY*2 + boxY/2)
    );

    private double xPosition;
    private double yPosition;

    elPosition(final double xPosition, final double yPosition) {
        this.xPosition = xPosition;
        this.yPosition = yPosition;
    }

    private static final double boxX = 10;
    private static final double boxY = 10;

    public double getXPosition() {
    return xPosition;
    }

    public double getYPosition() {
        return yPosition;
    }
}

如果使用某个值而不是计算,则不会发生错误。

标签: javaenums

解决方案


我会说“非法前向引用”是一个足够清晰的错误消息,其中包含了正在发生的事情。

为了防止滥用hacky代码,Java完全不允许您在声明变量之前访问它们。

碰巧的是,由于这些变量是常量,它们的值是在编译时评估的,它们的声明顺序实际上并不重要。Java 只是没有弯曲其一般规则以允许您在这种特定情况下这样做。

我解决它的一种方法是调用私有静态方法来获取值:

enum ElPosition {
  P1(
          (boxX() *0 + boxX() /2),
          (boxY() *0 + boxY() /2)
  ),
  P2(
          (boxX() *1 + boxX() /2),
          (boxY() *1 + boxY() /2)
  ),
  P3(
          (boxX() *2 + boxX() /2),
          (boxY() *2 + boxY() /2)
  );

  private double xPosition;
  private double yPosition;

  ElPosition(final double xPosition, final double yPosition) {
    this.xPosition = xPosition;
    this.yPosition = yPosition;
  }

  private static final double BOX_X = 10;
  private static final double BOX_Y = 10;

  private static double boxX() {
    return BOX_X;
  }

  private static double boxY() {
    return BOX_Y;
  }

  public double getXPosition() {
    return xPosition;
  }

  public double getYPosition() {
    return yPosition;
  }
}

推荐阅读