我有一个关于枚举的问题(它可能是一个简单的但......)。 这是我的计划:
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
?
代码如何“两次”到构造函数? 第一次是什么时候,第二次是什么时候? 为什么枚举构造函数不能公开? 这是它打印两次而不是一次打印的原因吗?
答案 0 :(得分:29)
枚举是单身人士,他们在加载课程时会被实例化 - 所以两个“你好”来自实习MyEnum.ONE
和MyEnum.TWO
(只是尝试打印value
)。
这也是构造函数不能公开的原因:Enum保证每个值只有一个实例 - 如果其他人可以使用构造函数,则不能这样做。
答案 1 :(得分:11)
代码如何“两次”到构造函数?
为枚举的每个元素调用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
答案 2 :(得分:3)
你的构造函数调用了两次。加载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;
}
}
Out put
hello1
hello2
hello3