代码之家  ›  专栏  ›  技术社区  ›  hvgotcodes

当枚举在类中时,在枚举构造函数中创建类的新实例

  •  1
  • hvgotcodes  · 技术社区  · 6 年前

    MyEnum 构造函数将在JVM加载时运行 MyClass

    MyClass {
    
       private enum MyEnum {
           VALUE;
    
           MyEnum() {
              System.out.println("MyEnum constructor");
              MyClass clazz = new MyClass(); 
           }
       }
    
       public MyEnum getValue() {
          System.out.println("getValue");
          return MyEnum.VALUE;
       }
    
    }
    
    public class MyClassTest {
    
        @Test
        public void testStuff() {
            MyClass clazz = new MyClass();
            clazz.getValue();
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Savior    6 年前

    类/接口/枚举/注释嵌套在另一个类中这一事实并不影响其初始化的时间。

    here

    类或接口类型T将在 首次出现下列情况之一:

    • T是一个类,创建了一个T的实例。
    • 调用由T声明的静态方法。
    • 分配一个由T声明的静态字段。
    • 使用由T声明的静态字段,并且该字段不是常量变量(§4.12.4).

    JLS也 says 以下是关于 enum 类型

    枚举声明指定新的枚举类型, 一种特殊的类类型

    以及 about its members 上面说

    E , 电子 public static final 类型字段 电子 那个 c . 该字段有一个变量初始值设定项 实例化 电子 c 对于 . 该字段的注释与 (如有)。

    把这些放在一起,你就会对你所看到的行为做出解释。

    您的代码实例化 MyClass ,然后调用 getValue() 方法。 getValue() MyEnum public static static VALUE 字段,调用相应的 髓鞘 构造再次打印到标准输出。