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

Свойство private enum

Конструктор для этого enum является закрытым. Что это значит?

public enum SLocale {

    EN_US(Locale.US, "www.abc.com", "www.edc.com", "www.vvv.com",
            "www.earn.com");

    List<String> domains;
    Locale loc;
    IMap map;

    private SLocale(Locale loc, String... domains) {
        this.domains = Arrays.asList(domains);
        this.loc = loc;
        this.siteMap = Factory.getMap(loc);
    }

    public List<String> getDomains() {
        return domains;
    }

    public Locale getLoc() {
        return loc;
    }

    public ISiteMap getMap() {
        return map;
    }
}
4b9b3361

Ответ 1

Частный конструктор позволяет только объекты создавать из определения класса. Будучи переименованием, легко запутаться, поэтому мне обычно легче думать о перечислении как классе с некоторыми специальными функциями. Поэтому, когда вы пишете:

SLocale.EN_US

В принципе, параметры

Locale.US, "www.abc.com", "www.edc.com", "www.vvv.com", "www.earn.com"

будет передан частному конструктору, чтобы можно было создать экземпляр enum. Конструкторы Enum должны быть частными.

Ответ 2

От: http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

Примечание. Конструктор для типа перечисления должен быть приватным к пакету или частный доступ. Он автоматически создает константы, которые определенный в начале тела перечисления. Вы не можете вызвать перечисление создайте себя.

На самом деле у вас нет публичного конструктора перечислений.

Ответ 3

Этот конструктор должен быть закрытым, потому что перечисления определяют конечный набор значений (например, EN_US, EN_UK, FR_FR, FR_BE). Если конструктор был общедоступным, потенциальные потенциально могут создавать больше значений (например, недопустимые/необъявленные значения, такие как XX_KK и т.д.). Это расширит набор первоначально объявленных значений.

Ответ 4

В Enums должны быть только частные конструкторы, это связано с тем, что Enum должен быть единственным, кто отвечает за возврат предопределенных экземпляров.

Ответ 5

В случае перечислений это означает то же самое, что и сделать его закрытым. Единственный способ создать экземпляр перечисления - объявить их в вашем классе enum. У перечислений не может быть открытых конструкторов.

Ответ 6

Это означает, что никакой код, отличный от самого класса enum, не может явно создать объект перечисления

Ответ 7

public enum Day {

    SUNDAY(), MONDAY, TUESDAY(2), WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;

    int value;

    private Day(int value) {
        System.out.println("arg cons");
        this.value = value;
    }

    private Day() {
        System.out.println("no arg cons");
    }

    public static void main(String args[]) {

    }

}

Вывод: no arg cons no arg cons arg cons no arg cons no arg cons no arg cons no arg cons

Представьте себе перечисление следующим образом:

SUNDAY() эквивалентно static final Day SUNDAY = new Day();

MONDAY также эквивалентен static final Day MONDAY = new Day(); // without paranthesis it calls the no-arg constructor/default no-arg constrctor if no other constructor

TUESDAY(2) эквивалентно static final Day TUESDAY = new Day(2);

Поскольку enum следует рассматривать как особый тип класса, он допускает "статический" объект создание. Поскольку вы не можете делать создания объектов за пределами класса enum, все создания объектов происходят на уровне объявления класса, и поэтому "статический" для создания объекта имеет смысл здесь.

В Enum все создания объектов (т.е. статические окончательные постоянные творения, если быть точными) должны происходить внутри самого этого класса enum (и, следовательно, частного конструктора), поскольку цель Enum состоит в том, чтобы иметь только фиксированный набор значимые константы в отношении вашего приложения и исключить неизмеримые утверждения/экземпляры, такие как Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)

Ответ 8

Я думал бы о Enums как о синглете и, следовательно, конструкторы должны быть частными, если они не являются одиночными, тогда подумайте, что все пойдет не так. когда u объявляет конструктор, тогда вы выполняете конечное статическое поведение java. вы можете инициализировать только один раз. этот тип импликации вышел из файла свойств или файлов cfg, которые необходимо загрузить один раз в начале приложения. проблема с nromal перечислениями и константами заключается в том, что вам нужно изменить код Java и выполнить перекомпиляцию. но если вы загружаете файл, мы можем его изменить и перезапустить, изменения вступят в силу. надеюсь, я пролил больше света на это.