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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

С

public interface HasAge {
    public int getAge();
}

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

Ответ 3

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

Ответ 4

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