Який найкращий підхід для використання Enum як синглтона в Java?


85

Спираючись на те, що було написано в запитанні SO Найкраща реалізація синглтона в Java - а саме про використання переліку для створення синглтона - в чому різниця / плюси / мінуси (конструктор опущений)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

а потім дзвонить Elvis.INSTANCE.getAge()

і

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

а потім дзвонить Elvis.getAge()

Відповіді:


96

Припустимо, ви прив'язуєтесь до чогось, що використовуватиме властивості будь-якого наданого йому об'єкта - ви можете дуже легко передати Elvis.INSTANCE, але ви не можете передати Elvis.class і очікувати, що він знайде властивість (якщо це спеціально не закодовано для пошуку статичні властивості класів).

В основному ви використовуєте одиночний шаблон лише тоді, коли вам потрібен екземпляр. Якщо статичні методи працюють добре для вас, тоді просто використовуйте їх і не турбуйтеся про перерахування.


1
Чому б не потрудитися з переліком? Чи є кращий спосіб зробити сінглтони в java5 +?
jontro

4
@jontro (перечитати) відповідь; він каже використовувати перелічення, коли потрібно мати синглтон, але уникати синглтона, якщо ви можете обійтися статичними методами
Miserable Variable

@MiserableVariable Я коментував це понад рік тому. Не можу насправді згадати, про який контекст я мав на увазі.
jontro

не відповідає на поставлене питання
Thufir 02

2
@Thufir: Він відповідає на частину "в чому різниця" - яка, здається, є тим, що найбільше зацікавило ОП, враховуючи те, що відповідь прийнято.
Jon Skeet

69

Великою перевагою є те, коли ваш синглтон повинен реалізовувати інтерфейс. За вашим прикладом:

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

З:

public interface HasAge {
    public int getAge();
}

Це не можна зробити зі статикою ...


1
Це можна зробити зі статикою ... public static final HasAge INSTANCE = new HasAge () {private int age; @Override public int getAge () {return age; }}; ... тому мені все ще цікаво, що добре чи краще у методі перерахування. Думаю, якщо вам потрібно було реалізувати два інтерфейси?
Шон Адкінсон,

9

(Статусні) Однотонні, як правило, використовують, щоб робити вигляд, що не використовують статичні змінні. Якщо ви насправді не використовуєте загальнодоступну статичну змінну, тоді ви обдурите менше людей.


8

Я б обрав варіант, який є найпростішим і зрозумілим. Це дещо суб’єктивно, але якщо ви не знаєте, що є найбільш зрозумілим, просто виберіть найкоротший варіант.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.