java - 创建带有计算值的枚举

标签 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 + 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;
    }
}

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

最佳答案

我想说“非法前向引用”是一个足够清晰的错误消息,其中包含了阻碍的内容。

为了尝试防止滥用黑客代码,Java 完全不允许您在声明变量之前访问变量。

但是,由于这些变量是常量,它们的值在编译时计算,并且它们声明的顺序实际上并不重要。 Java 并没有改变其一般规则来允许您在这种特定情况下执行此操作。

我解决这个问题的一种方法是调用私有(private)静态方法来获取值:

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

关于java - 创建带有计算值的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57785376/

相关文章:

java - EnumSet 'and' 操作

c - meminfo_proc_show() 的枚举和 si_meminfo() 的变量集在哪里?

c# - MVC EnumMember 自定义字符串

java - 字符类减法

java - Java中的动态对象注册

java - Libgdx file.internal 文件未找到错误

java - JPA Query 仅选择特定列而不使用 Criteria Query?

java - 安卓耳机插孔

c# - 将枚举绑定(bind)到 WPF 控件(如 Combobox、TabHeader 等)的方法

枚举可以被认为是不安全的吗?