Каков наилучший подход для использования Enum в качестве синглтона в Java? - PullRequest
85 голосов
/ 09 января 2009

Опираясь на то, что было написано в вопросе SO Лучшая реализация Singleton в Java - а именно об использовании enum для создания singleton - каковы различия / плюсы / минусы между (конструктор опущен)

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()

Ответы [ 4 ]

95 голосов
/ 09 января 2009

Предположим, что вы привязываетесь к чему-то, что будет использовать свойства любого заданного объекта - вы можете очень легко передать Elvis.INSTANCE, но вы не можете передать Elvis.class и ожидать, что он найдет свойство (если только это не сделано намеренно). кодируется для поиска статических свойств классов).

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

68 голосов
/ 09 января 2009

Большое преимущество, когда ваш синглтон должен реализовывать интерфейс. Следуя вашему примеру:

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

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

С:

public interface HasAge {
    public int getAge();
}

Это невозможно сделать со статикой ...

9 голосов
/ 09 января 2009

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

8 голосов
/ 19 июля 2009

Я бы выбрал самый простой и понятный вариант. Это несколько субъективно, но если вы не знаете, что самое ясное, просто выберите самый короткий вариант.

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