枚举属性&副作用

时间:2013-12-03 07:07:34

标签: java enums

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

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

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

3 个答案:

答案 0 :(得分:29)

枚举是单身人士,他们在加载课程时会被实例化 - 所以两个“你好”来自实习MyEnum.ONEMyEnum.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