Страницы

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

суббота, 7 декабря 2019 г.

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

#java #шаблоны_проектирования #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! 
Тем не менее, считается, что данный синглтон неленивый и инициализируется сразу при
загрузке класса.
Вопрос: что я делаю не так?
    


Ответы

Ответ 1



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

Ответ 2



В java сами классы тоже являются объектами, как и экземпляры этого класса. Только создаются они по мере того как класс используется в коде - в единственном экземпляре на каждый загрузчик. Все что static относится к самому классу, а не к экземпляру. Следовательно, все инициализации static произойдут в момент создания объекта- класса, а не в момент первого обращения к объекту-экземпляру.

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

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