Подтвердить что ты не робот

Шаблон Singleton (решение Билла Пью)

Я читаю wiki об одноэлементном шаблоне, и я не уверен, насколько я это понимаю: https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom его часть.

Итак, чтобы сделать его простым: Почему решение Билла Пью лучше, чем пример выше?

Это потому, что статический класс не является загрузкой виртуальной машины до ее фактического использования или что-то вроде этого, поэтому мы не создаем объект, прежде чем переходить к методу getInstance()? Кроме того, этот метод защищен только до степени инициализации объекта?

4b9b3361

Ответ 1

Я думаю, что версия г-на Пью имеет большое значение, потому что она выполняет только экземпляр singleton, когда getInstance() называется i.e, когда не загружен класс (класс, содержащий метод getInstance). Если ваша конструкция singleton делает что-то дорогое, это может быть для вас преимуществом. Если вы похожи на большинство стран мира, чьи синглтоны - это просто избежать статических методов (и вы не перешли на рамки внедрения зависимостей), я бы не потерял сон над ним.

Как говорится в статье, метод г-на Пью более ленив, чем статическая переменная экземпляра, но на самом деле, если класс Singleton загружается, вы все равно будете называть метод getInstance. Так как компьютерная наука это полезно, но в реальном мире ее преимущества спорны.

p.s. Меня не очень волнует пример г-на Блоха, поскольку использование перечисления будет состоять в том, чтобы сказать, что перечисление My Singleton IS-A, которое мне не подходит (особенно от человека, который, по праву, говорит, что никогда не реализует интерфейс только для получить константы)

Ответ 2

JLS гарантирует, что класс загружается только тогда, когда он используется в первый раз (что делает инициализацию singleton ленивой) и что загрузка класса является потокобезопасной (что также делает поточный метод getInstance)

Ответ 3

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

Не только статический класс, любой класс. Классы не загружаются до тех пор, пока не будут указаны ссылки. См. JLS - 12.4.1 При возникновении инициализации

или что-то вроде этого, поэтому мы не создайте объект, прежде чем мы перейдем к метод getInstance()?

Совершенно верно.

Также этот метод защищен только потоком в степени инициализации объект?

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

Ответ 4

Это потому, что статический класс не нагрузка виртуальной машины до ее фактического используется или что-то вроде этого, поэтому мы не создавайте объект, прежде чем мы к методу getInstance()?

Правильно.

Кроме того, этот метод защищен только до степени инициализации объекта?

Он гарантирует, что создается только один экземпляр, и ни один клиент не получает ничего, кроме ссылки на полностью инициализированные экземпляры.

Ответ 5

Ключевой частью объяснения является следующее:

Вложенный класс ссылается на no раньше (и, следовательно, загружено нет ранее загрузчиком классов), чем момент, который вызывается getInstance(). Таким образом, это решение является потокобезопасным без специального языка конструкции (т.е. летучие или синхронизированы).

Решение "Билл Пог" обеспечивает ленивость.