когда одноэлементный класс предпочтительнее класса, который имеет только статические методы? - PullRequest
1 голос
/ 21 сентября 2011

Когда одноэлементный класс предпочтительнее класса, который имеет только статические методы и закрытый конструктор по умолчанию?

Пожалуйста, проголосуйте.

Ответы [ 6 ]

5 голосов
/ 21 сентября 2011

Используйте синглтон для лучшего контроля, когда происходит инициализация. В статическом классе любая инициализация должна происходить во время загрузки класса, над которым у вас мало контроля. Например, простая ссылка на статический финальный MEMBER вызовет загрузку класса. При использовании синглтона инициализация может быть тривиально отложена на много позже - как правило, до первого использования.

Причины задержки инициализации могут быть:

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

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

Использование одиночного кода также упрощает тестирование инициализации.

Используйте синглтон, когда вам может потребоваться отладка инициализации. Следы стека от статической инициализации могут вызывать недоумение. Отладка тоже может быть загадочной. Если класс загружается раньше, он может сломаться до того, как точка останова в первой строке в main () будет даже достигнута.

5 голосов
/ 21 сентября 2011

Когда синглтон-класс предпочтительнее класса, который имеет только статические методы и закрытый конструктор по умолчанию?

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

1 голос
/ 21 сентября 2011

Основная причина наличия только статических методов - когда вам просто нужен набор инструментов для объединения некоторых функций.

Я использую синглтоны в основном по двум причинам:

  1. Это действительно дорого (время или память), чтобы построить объект, и Я хочу сделать это только один раз.
  2. Данные, связанные с классом должно быть одинаковым в каждом экземпляре класса.
1 голос
/ 21 сентября 2011

Если у вас есть какое-то состояние, которое вам нужно сохранить, то вам нужен синглтон.Например, если вашему классу нужно загрузить некоторую конфигурацию из файла свойств.

0 голосов
/ 21 сентября 2011

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

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

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

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

0 голосов
/ 21 сентября 2011

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

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

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