【问题标题】:In Java, when is the constructor for an enumerated constant invoked?在 Java 中,何时调用枚举常量的构造函数?
【发布时间】:2009-09-04 19:00:15
【问题描述】:

要在 Java 中使用人为的示例,代码如下:

enum Commands{
   Save("S");
   File("F");

   private String shortCut;
   private Commands(String shortCut){ this.shortCut = shortCut; }
   public String getShortCut(){ return shortCut; }
}

我有以下测试/驱动程序代码:

public static void main(String args[]){
   System.out.println(Commands.Save.getShortCut());
}

问题是: 在 Java 中,何时调用枚举常量的构造函数?在上面的例子中,我只使用了Save 枚举常量。这是否意味着只调用一次构造函数来创建Save?还是SaveFile 无论如何都会一起构建?

【问题讨论】:

    标签: java enums constructor


    【解决方案1】:

    构造函数在enum 类初始化时被调用。无论实际引用和使用了哪些成员,都会按照成员声明的顺序调用每个构造函数。

    【讨论】:

    • 这是否意味着当ClassLoader 加载类时,会调用枚举的构造函数?还是像 Save 和 File 这样的访问成员会调用构造函数?如果没有参数构造函数会发生什么?
    • @MuhammadBabar 无需初始化即可加载类。所以,不,这意味着当类被初始化时,每个成员都被构造出来。而且,正如我所说,是否引用成员并不重要;它在类初始化时被构造。你的第二个问题不清楚。如果没有为成员提供参数,则必须定义无参数构造函数,否则枚举将无法编译。是这个意思吗?
    • 但是在枚举中我们从不做 new SomeEnum() 即没有显式初始化!在我的例子中,枚举只有一个变量,即 instance 和一个没有参数的私有构造函数。这个构造函数什么时候被调用?
    • @MuhammadBabar enum 成员的声明使用一些“语法糖”来生成代码。如果你声明一个enumStatus { GOOD, BAD; private Status() { } },它相当于public static final GOOD = new Status(); public static final BAD = new Status(); 之类的东西,并且当Status“类”被加载时执行该代码。
    【解决方案2】:

    static() {...} 方法很相似,构造函数在第一次初始化 Enum 类时被调用。 Enum 的所有实例都在使用之前创建。

    public static void main(String args[]){
       System.out.println(Commands.Save.getShortCut());
    }
    

    在此示例中,SaveFile 的 ctor 将在调用 Save.getShortCut() 之前完成。

    它们被顺序调用,如代码中所声明的那样。

    【讨论】:

      【解决方案3】:

      正如其他人所说,两者都将在类初始化时创建。我想指出这是在任何静态初始化程序之前完成的,因此您可以在静态块中使用这些枚举。

      【讨论】:

        猜你喜欢
        • 2011-08-20
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多