枚举属性和副作用

wan*_*arn 22 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; 
        } 
}
Run Code Online (Sandbox Code Playgroud)

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

hello
hello
Run Code Online (Sandbox Code Playgroud)

并不是

hello

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

pie*_*t.t 29

枚举是单身人士和他们在班级的加载实例化-这样的两个"你好"来自instanciatingš MyEnum.ONEMyEnum.TWO(只是尝试打印value为好).

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


Mic*_*ian 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; 
    } 
}
Run Code Online (Sandbox Code Playgroud)

输出:

hello 1
hello 2
Run Code Online (Sandbox Code Playgroud)