【问题标题】:Java enum constructor is called multiple times [closed]Java枚举构造函数被多次调用[关闭]
【发布时间】:2014-06-28 19:41:34
【问题描述】:

我看到如下枚举用法。

public enum MyEnum {
  ENUM1(1),
  ENUM2(2),
  ENUM3(3);

  private int enumValue;
  MyEnum(int i) { this.enumValue = i; }
  public int getEnum() { return this.enumValue; }
}

// this is the call
MyEnum.ENUM1.getEnum()

当进行上述调用时,MyEnum 的构造函数被调用了 3 次。我只想获取一个值,但创建了三个实例!这不是一件坏事还是我做错了什么?

编辑:我的理解是,当第二次调用MyEnum.ENUM3.getEnum() 时,不再创建新实例。

【问题讨论】:

  • 嗯,ENUM1ENUM2ENUM3 都必须构造,不是吗?
  • 了解 .ordinal() 是什么
  • 你已经定义了三个实例,所以它必须创建你定义的实例。如果您想要更少的实例,请定义您想要的数量。
  • 你能解释一下为什么this a bad thing吗?
  • @PeterLawrey 哎呀,很抱歉。我认为这些实例是为每次调用创建的。

标签: java enums


【解决方案1】:

你有三个枚举常量

ENUM1(1),
ENUM2(2),
ENUM3(3);

对于每个常量,都需要调用构造函数。这是正常行为。

常量在枚举类加载初始化时全部初始化。

【讨论】:

  • 在堆上创建三个实例,然后将它们销毁。做这样的事情会导致性能损失。那么为什么人们更喜欢这样的东西呢?
  • @RicardoCristianRamirez 他们没有被摧毁。它们由static 类中的static 变量(对程序员隐藏)引用。它们不能被 GC 处理(直到类被 GC 处理)。
【解决方案2】:

创建了三个实例 ENUM1、ENUM2 和 ENUM3 - 由于您在加载类时声明了 MyEnum。您的调用只是检索与 ENUM1 关联的 int。

这是 Java 枚举的定义方式。你不能改变它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多