枚举属性和副作用
我有一个关于枚举的问题(它可能是一个简单的但……)。 这是我的计划:
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.ONE
和MyEnum.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