Разница между статическим классом и одноэлементным шаблоном? - PullRequest
1646 голосов
/ 06 февраля 2009

Какая реальная (то есть практическая) разница существует между статическим классом и одноэлементным шаблоном?

Оба могут быть вызваны без создания экземпляров, оба предоставляют только один «Экземпляр», и ни один из них не является поточно-ориентированным. Есть ли другая разница?

Ответы [ 36 ]

4 голосов
/ 07 июня 2012

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

Я бы сказал, что самое большое отличие состоит в том, что синглтон по-прежнему является обычным Java-бином, в отличие от специализированного статического Java-класса. И из-за этого синглтон принимается во многих других ситуациях; на самом деле это стратегия реализации Spring Framework по умолчанию. Потребитель может знать, а может и не знать, что это передаваемый синглтон, он просто обращается с ним как с обычным Java-бином. Если требования изменяются, а синглтон должен стать вместо этого прототипом, как мы часто видим в Spring, это можно сделать полностью без каких-либо изменений кода для потребителя.

Кто-то еще упоминал ранее, что статический класс должен быть чисто процедурным, например java.lang.Math. На мой взгляд, такой класс никогда не должен передаваться, и они никогда не должны содержать ничего, кроме static final, в качестве атрибутов. Для всего остального используйте синглтон, так как он намного гибче и проще в обслуживании.

3 голосов
/ 14 января 2014

а. Сериализация - Статические члены принадлежат классу и, следовательно, не могут быть сериализованы.

б. Хотя мы сделали конструктор закрытым, статические переменные-члены все равно будут перенесены в подкласс.

с. Мы не можем выполнить отложенную инициализацию, так как все будет загружено только при загрузке класса.

3 голосов
/ 13 ноября 2013

В статье, которую я написал, я описал свою точку зрения о том, почему синглтон намного лучше, чем статический класс:

  1. Статический класс на самом деле не является каноническим классом - это пространство имен с функциями и переменными
  2. Использование статического класса не является хорошей практикой из-за нарушения принципов объектно-ориентированного программирования
  3. Статический класс не может быть передан в качестве параметра для других
  4. Статический класс не подходит для «ленивой» инициализации
  5. Инициализация и использование статического класса всегда отслеживаются
  6. Трудно реализовать управление потоками
3 голосов
/ 04 августа 2014

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

3 голосов
/ 08 мая 2012
  1. Ленивая загрузка
  2. Поддержка интерфейсов для обеспечения отдельной реализации
  3. Возможность вернуть производный тип (как комбинация отложенной загрузки и реализации интерфейса)
3 голосов
/ 18 октября 2016
  1. Мы можем создать объект одноэлементного класса и передать его методу.

  2. Класс Singleton не ограничивает наследование.

  3. Мы не можем располагать объекты статического класса, но можем синглтон-класс.

3 голосов
/ 31 декабря 2015

Я прочитал следующее и думаю, что это тоже имеет смысл:

Забота о бизнесе

Помните, одно из самых важных правил ОО состоит в том, что объект отвечает за себя. Это означает, что вопросы, касающиеся жизненного цикла класса, должны обрабатываться в классе, а не делегироваться таким языковым конструкциям, как static и т. Д.

из книги «Объектно-ориентированный мыслительный процесс», 4-е изд.

2 голосов
/ 31 марта 2014

Существует огромная разница между единственным статическим классом экземпляром (то есть единственным экземпляром класса, который оказывается статической или глобальной переменной) и единственным статическим указателем экземпляру класса в куче:

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

1 голос
/ 09 июня 2018

A статический класс в Java имеет только статические методы. Это контейнер функции. Он создан на основе процедурного программирования.

Класс Singleton - это шаблон в объектно-ориентированном дизайне Синглтон В классе есть только один экземпляр объекта в JVM. Эта модель реализован таким образом, что всегда есть только один экземпляр этот класс присутствует в JVM.

1 голос
/ 08 сентября 2017

Разница в моей голове заключается в реализации объектно-ориентированного программирования (Singleton / Prototype) или функционального программирования (Static).

Мы слишком сосредоточены на количестве объектов, созданных одноэлементным шаблоном, когда мы должны сосредоточиться на том, чтобы в конце мы удерживали объект. Как уже говорили другие, его можно расширять, передавать в качестве параметра, но самое главное, он заполнен государством.

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

Кстати, вы знали, что можете создавать одноэлементные статические классы:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...