Частный конструктор enum - PullRequest
       2

Частный конструктор enum

50 голосов
/ 18 августа 2011

Конструктор для этого 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;
    }
}

Ответы [ 8 ]

46 голосов
/ 19 августа 2011

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

SLocale.EN_US

В основном, параметры

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

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

45 голосов
/ 19 августа 2011

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

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

У вас не может быть общедоступного конструктора enum.

9 голосов
/ 19 августа 2011

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

5 голосов
/ 19 августа 2011

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

3 голосов
/ 19 августа 2011

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

3 голосов
/ 19 августа 2011

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

2 голосов
/ 14 декабря 2014
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)

0 голосов
/ 22 октября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...