Как реализовать синглтон в Java?

Всем добра.

Тема довольна избита и ответ многим широко известен (раз статья, два статья), но поставлю вопрос следующим образом: почему рекомендуют использовать On Demand Holder реализацию, а не обычную через статический метод getInstance(), который возвращает значение статического поля?

Инстанс будет создан в момент инициализации класса, т.е. при первом обращении к статическому методу getInstance (так говорит JLS). Почему же тогда этот вариант отбрасывается и не считается ленивым?

И, чтобы не быть голословным, пример:
public class Main {

    static class Singleton {

        private static final Singleton INSTANCE = new Singleton();

        public static Singleton getInstance(){
            return INSTANCE;
        }

        private Singleton(){
            System.out.println("instance created");
        }
    }

    public static void main(String[] args) {
        System.out.println("1");
        Singleton instance1 = null;
        System.out.println("2");
        Singleton instance2 = Singleton.getInstance();
        System.out.println("3");
    }
}

Вывод:
1
2
instance created
3
  • Вопрос задан
  • 3366 просмотров
Решения вопроса 1
@Artyushov
Возможно, дело в том, что во втором случае instance создаётся не при вызове метода getInstance(), а при загрузке класса в виртуальную машину. То есть, если вы каким-то образом обратитесь к этому классу не для того, чтобы получить instance, то он всё равно будет создан.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
во второй приведенной вами статьей описано, почему, что и когда лучше. + в комментариях мельком затрагиваются моменты когда вообще не стоит использовать сингелтон.
Ответ написан
Например, добавив в класс метод
public static void test() {
            System.out.println("test");
        }

и вызвав его
System.out.println("1");
        Singleton instance1 = null;
        instance1.test();
        System.out.println("2");
        Singleton instance2 = Singleton.getInstance();
        System.out.println("3");

получим такой результат :
1
instance created
test
2
3
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы