Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Почему Singleton считается неленивым?

Возьмём обычный Singleton.
public class Single1 {
private static final Single1 INSTANCE = new Single1();
private Single1() { System.out.println("Single1 - Constructor"); }
public static Single1 getInstance(){ System.out.println("Single1.getInstance"); return INSTANCE; } }
В конструкторе сделаем вывод в System.out. При работе программы видно, что конструктор вызывается при первом вызове getInstance! Тем не менее, считается, что данный синглтон неленивый и инициализируется сразу при загрузке класса. Вопрос: что я делаю не так?


Ответ

Дело не в первом вызове getInstance(), а в первом обращении к классу Single1
Если Вы создадите еще один статический метод, не getInstance(), который просто выводит на экран строку, то тоже увидите инициализацию INSTANCE
Ленивым синглетоном считается именно тот, который инициализируется при прямой необходимости в инстансе (то есть при вызове именно getInstance(), а не другого метода класса). Эта реализация не удовлетворяет сказанному, следовательно это не ленивый синглетон).

Комментариев нет:

Отправить комментарий