枚举属性和副作用

我有一个关于枚举的问题(它可能是一个简单的但……)。 这是我的计划:

public class Hello { public enum MyEnum { ONE(1), TWO(2); private int value; private MyEnum(int value) { System.out.println("hello"); this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { MyEnum e = MyEnum.ONE; } } 

我的问题是:为什么输出是

 hello hello 

并不是

hello

代码如何“两次”到构造函数? 第一次是什么时候,第二次是什么时候? 为什么枚举构造函数不能公开? 这是它打印两次而不是一次打印的原因吗?

枚举是单身人士,他们在加载课程时会被实例化 – 所以两个“你好”来自MyEnum.ONEMyEnum.TWO (也只是尝试打印value )。

这也是构造函数不能公开的原因:Enum保证每个值只有一个实例 – 如果其他人可以使用构造函数则不能。

代码如何“两次”到构造函数?

为枚举的每个元素调用Conctructor。 很少改变你的示例来演示它:

 public class Hello { public enum MyEnum { ONE(1), TWO(2); private int value; private MyEnum(int value) { this.value = value; System.out.println("hello "+this.value); } public int getValue() { return value; } } public static void main(String[] args) { MyEnum e = MyEnum.ONE; } } 

输出:

 hello 1 hello 2 

您的构造函数调用两次。 在加载Enum类的那一刻,它将调用等于enum类型数量的时间。

  MyEnum e = MyEnum.ONE; // singleton instance of Enum 

考虑以下

 public class Hello { public enum MyEnum { ONE(1), TWO(2), THREE(3); private int value; private MyEnum(int value) { System.out.println("hello"+value); this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { MyEnum e = MyEnum.ONE; } 

}

出局

 hello1 hello2 hello3