Подтвердить что ты не робот

Свойства enum и побочные эффекты

У меня есть вопрос относительно перечисления (это может быть простой, но...). Это моя программа:

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

Как код "идет" дважды в конструктор? Когда первый раз, а когда второй? И почему конструктор перечисления не может быть общедоступным? Это причина, почему он печатает дважды, а не только один раз?

4b9b3361

Ответ 1

Перечисления - это синглтоны, и они запускаются при загрузке класса, поэтому два "приветствия" исходят из instageiating MyEnum.ONE и MyEnum.TWO (просто попробуйте распечатать value).

Это также является причиной того, что constuctor не должен быть общедоступным: Enum гарантирует, что когда-либо будет только один экземпляр каждого значения, который он не может, если кто-то другой может играть с конструктором.

Ответ 2

Как код дважды переходит к конструктору?

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

Ответ 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