【问题标题】:Creating enum with calculation value [duplicate]使用计算值创建枚举[重复]
【发布时间】:2020-01-07 04:03:45
【问题描述】:

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

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

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

【问题讨论】:

  • 错误是什么?
  • 非法前向引用
  • 您需要将get..Position 方法抽象化,并为每个枚举常量实现它们。大概。另外,请注意 Java 命名约定规定类/接口/枚举名称是 CamelCase 并以大写字母开头。
  • @FedericoklezCulloca Nah。那是针对构造函数内容,而不是针对构造函数调用。问题不同。
  • @EamonScullion Nah,完全不相关

标签: java enums


【解决方案1】:

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

【讨论】:

  • @AxelH 事实上,我做到了,但我必须先看到它。
【解决方案2】:

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

为了防止滥用 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;
  }
}

【讨论】:

  • 现在试试private static final Double BOX_X = Double.valueOf(10)。你会看到这个解决方案只适用于原始类型。
  • 我知道这一点。在我看来,问题的全部意义在于利用这些变量是常量,而 Double 包装器不是。如果您没有常量可玩,请放弃该构造。
  • Double 和所有其他原始包装器都是不可变的......所以我认为从常量中使用它们没有任何问题。
  • @AxelH 我的意思是编译时常量,Java 用它在编译时知道其值的变量做的事情,因此它用它们的值替换变量。这是一件真实的事情,想要利用它是可以理解的。替代方案会强制创建一个不同的类,这很糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多