Java Singleton Pattern, должны ли все переменные быть переменными класса?

StackOverflow https://stackoverflow.com/questions/1767601

Вопрос

Если класс реализует синглтонский шаблон, должны ли все переменные быть объявленными статическими?

Есть ли причины, по которой они не должны быть объявлены статичными? Есть ли разница?

Это было полезно?

Решение

Нет. Синглтонский шаблон просто означает, что один экземпляр является единственным экземпляром - это не означает «сделать все статически доступным».

Синглтон -шаблон дает вам все преимущества «единственного экземпляра», не жертвуя способностью проверять и рефракторный ваш код.

Редактировать:

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

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

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

Кроме того, в программном обеспечении, над которым я работал, инициализация и жизненный цикл объектов часто контролируются кем -то другим (я говорю о DI здесь) - и сделать что -то статическое, на самом деле здесь не помогает.

Другие советы

В одном общем одноэлементном рисунке вы делаете нет Используйте статику. Вы кодируете класс, чтобы использовать обычные поля, вы инициализируете в конструкторе, а затем договоритесь выполнить новый MyClass() Однажды сохраняя результаты в каком -то статическом месте.

Нет, единственное, что обычно является статичным, - это ссылка на сам Синглтон (и есть и другие способы сохранить эту ссылку, такие как JNDI или контейнеры для инъекций зависимости).

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

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

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

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

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

Вы можете прочитать о том, как (один из возможных способов) создать синглтон в Java здесь:

Wikibooks Design Patterns: Java Singleton

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

  • Проверьте ответы от Paxdiablo и Thilo
  • Также не забывайте, что все статическое не делает его синглтоном, вам также нужно удалить каждый конструктор (и сделать конструктор по умолчанию частным)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top