Каков наилучший подход для использования Enum в качестве синглтона в Java?

Основываясь на том, что было написано в вопросе 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 ответа

Решение

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

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

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

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

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

С:

public interface HasAge {
    public int getAge();
}

Это не может быть сделано с помощью статики...

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

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

Другие вопросы по тегам