Разве плохо использовать Singletons для неизменных классов без аргументов? - PullRequest
0 голосов
/ 15 января 2019

Я сейчас работаю над небольшим Java-проектом, и пока делаю это там, где создано несколько классов, представляющих какое-то поведение типа Constant, например, используемое в качестве возвращаемого значения по умолчанию для других методов.

Теперь все, что их объединяет, это то, что они полностью неизменны и имеют только конструктор без аргументов. Это означает, что создание нескольких экземпляров этого класса всегда приведет к идентичным объектам.

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

Ответы [ 4 ]

0 голосов
/ 15 января 2019

Даже в небольшом проекте я бы старался придерживаться принципа обращения зависимостей , то есть класс не создает свои собственные зависимости, а объявляет их, как правило, в конструкторе. Таким образом, каждый класс можно разрабатывать и тестировать изолированно, в то же время связывая вместе со всем остальным, используя либо среду, такую ​​как Spring или Guice, либо ручное внедрение зависимостей . При такой установке у вас, скорее всего, будет только один экземпляр рассматриваемого класса, но вам не нужно будет реализовывать классический шаблон синглтона.

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

0 голосов
/ 15 января 2019

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

0 голосов
/ 15 января 2019

Давайте рассмотрим плюсы и минусы синглтона, если у вас есть небольшой проект и неизменяемые классы, которые используются в качестве возвращаемых значений по умолчанию.

Плюсы синглтона в этом случае:

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

Минусы

  • Больше кода для чтения и записи ; Хотя написание getInstance() методов может показаться не таким уж большим делом, другие люди (потенциально) работающие с вами, потратят некоторое время на изучение того, что на самом деле делает getInstance(), исправляя ошибки или просто предпринимая некоторую бизнес-логику. Я видел несколько удивительных getInstance() методов, хотя они имели условное название.

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

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

0 голосов
/ 15 января 2019

В ваших обстоятельствах использование шаблона Singleton имеет смысл. Для простого приложения вы можете использовать статический метод для возврата экземпляра. Если вы работаете в среде, обеспечивающей инверсию управления, такой как Spring, среда IOC будет обрабатывать одиночные запросы для вас.

...