Свойства 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
Как код "идет" дважды в конструктор?
Когда первый раз, а когда второй?
И почему конструктор перечисления не может быть общедоступным?
Это причина, почему он печатает дважды, а не только один раз?
Ответы
Ответ 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