Java 使用计算值创建枚举

Java 使用计算值创建枚举,java,enums,Java,Enums,我使用以下代码,在枚举内计算值时出错: 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 +

我使用以下代码,在枚举内计算值时出错:

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;
    }
}

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

问题在于,在您尝试使用它们时,boxX&boxYaren没有声明。静态是按行顺序已知的,您不能在枚举常量之前声明静态。

我要说的是,非法转发引用是一条非常清楚的错误消息,其中包含了所遇到的问题

为了防止滥用黑客代码,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;
  }
}

错误是什么?非法的前向引用您需要使get..Position方法抽象,并为每个枚举常量实现它们。可能另外,请注意,Java命名约定规定类/接口/枚举名称为CamelCase,以大写字母开头。@FedericoklezCulloca-Nah。这是针对构造函数内容的,而不是针对构造函数调用的。问题不一样。@eamonsculion-Nah,与之无关all@AxelH事实上,我是这样做的,但我必须先看到它。现在尝试使用private static final Double BOX_X=Double.valueOf10。您将看到这个解决方案只适用于基本类型。我知道这一点。在我看来,问题的关键在于利用这些变量是常量,而双包装器不是。如果您没有常量可供使用,请放弃该构造。Double和其他每个基本包装器都是不可变的。。。因此,我认为从常量中使用它们没有任何问题。@AxelH我指的是编译时常量,Java在编译时使用它知道的变量值,因此它用它们的值替换变量。这是一件真实的事情,想要利用它是可以理解的。替代方案将迫使创建一个不同的类,而这类类很糟糕。