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

Зачем использовать синглтон вместо статических методов?

Я не нашел хороших ответов на эти простые вопросы об классах помощника/утилиты:

Почему я должен создать singleton (stateless) вместо использования статических методов?

Зачем нужен экземпляр объекта, если объект не имеет состояния?

4b9b3361

Ответ 1

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

  • вы ожидаете продлить его состояние в обозримом будущем или
  • вам нужен экземпляр объекта по определенной технической причине (например, для оператора С# lock, хотя это уже довольно надуманно) или
  • вам нужно наследование, т.е. вы хотите легко заменить свой синглтон другим, используя тот же интерфейс, но с другой реализацией. Например, метод Toolkit.getDefaultToolkit() в Java вернет singleton, чей точный тип зависит от системы.

Ответ 2

Я мог видеть случай использования одиночного одиночного элемента без использования статических методов, а именно Injection of Dependency.

Если у вас есть вспомогательный класс функций утилиты, который вы используете напрямую, он создает скрытую зависимость; вы не можете контролировать, кто может его использовать, или где. Внедрение этого же класса-помощника через экземпляр singleeless SingleStan позволяет контролировать, где и как он используется, и заменить его /mock/etc, когда вам нужно.

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

Ответ 3

На самом деле я нашел еще один ответ, который не упоминается здесь: статические методы сложнее тестировать.

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

Ответ 4

В большинстве языков программирования классы ускользают от системы типов. Хотя класс с его статическими методами и переменными является объектом, он очень часто не может реализовать интерфейс или расширять другие классы. По этой причине он не может использоваться полиморфным образом, поскольку он не может быть подтипом другого типа. Например, если у вас есть интерфейс IFooable, который требуется для нескольких сигнатур методов других классов, объект класса StaticFoo не может использоваться вместо IFooable, тогда как FooSingleton.getInstance() может (предположим, FooSingleton реализует IFooable).

Обратите внимание, что, поскольку я прокомментировал ответ Хайнци, одноэлемент является шаблоном для контроля экземпляра. Он заменяет new Class() на Class.getInstance(), что дает автору Class больше контроля над экземплярами, которые он может использовать для предотвращения создания ненужных экземпляров. Синглтон - это всего лишь особый случай шаблона factory и должен рассматриваться как таковой. Общее использование делает его скорее особым случаем глобальных реестров, что часто заканчивается плохо, потому что глобальные реестры не должны использоваться волей-неволей.

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

Greetz
back2dos

Ответ 5

Существует компромисс между использованием какого-либо. Синглтоны могут иметь или не иметь состояния, и они относятся к объектам. Если они не сохраняют состояние и используются только для глобального доступа, то статичность лучше, так как эти методы будут быстрее. Но если вы хотите использовать объекты и концепции ООП (полиморфизм наследования), то лучше использовать singleton.

Рассмотрим пример: java.lang.Runtime - это одноэлементный класс в java. Этот класс допускает различные реализации для каждой JVM. Реализация является единой для JVM. Если этот класс был бы статичным, мы не сможем передавать разные реализации на основе JVM.

Я нашел эту ссылку действительно полезной: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html?

Надеюсь, что это поможет!

Ответ 6

Для меня "Требуется использование объекта объекта Singleton, Want Function использует статический метод"

Это зависит от того, что вы хотите. Всякий раз, когда вы хотите, чтобы состояние объекта (например, полиморфизм, как Null, вместо null или состояние по умолчанию), singleton является подходящим выбором для вас, тогда как статический метод используется, когда вам нужна функция (Receive input then return output).

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

P.S. Производительность между ними различается в миллисекундах, поэтому сначала сосредоточьтесь на Архитектуре.

Ответ 7

Синглтон не является апатридом, он содержит глобальное состояние.

Некоторые причины, по которым я могу думать о использовании Singleton, заключаются в следующем:

  • Чтобы избежать утечек памяти
  • Обеспечение того же состояния для всех модулей в приложении, например, подключение к базе данных