Рейтинг:
18
F-ES Sitecore
Используя синглеты, легче контролировать, когда класс инициализируется, чтобы использовать такие вещи, как ленивая инициализация и т. д. Используя статические классы, вы в значительной степени получаете то, что вам дано, ваш класс инициализируется при создании. Кроме того, используя sigleton, ваш конечный класс все еще является объектом, а не статическим классом, поэтому имеет преимущества, которые приходят с этим, то есть он может быть использован в модульном тестировании проще, использовать функции OO, такие как наследование, может быть передан как объект другим методам, хранить состояние и т. д.
Nathan Minier
Возможно, стоит также отметить, что Синглеты выводят (хотя и не гарантируют) определенную степень потокобезопасности, в то время как статические классы этого не делают.
F-ES Sitecore
Не уверен, что я соглашусь с этим на самом деле, либо можно сделать потокобезопасными, либо нет, в зависимости от того, как вы их кодируете. Фреймворк гарантирует, что статический конструктор будет потокобезопасным, но что касается методов, то все зависит от того, как вы их кодируете, как это было бы и для синглтона, только с синглтоном вы иногда полагаетесь на свой собственный код для обеспечения потокобезопасной инициализации, а не на гарантии, предоставляемые фреймворком.
Nathan Minier
Это справедливо,и мы можем согласиться не согласиться.
Однако если я назову что-нибудь синглетным, я собираюсь обеспечить потокобезопасность на нем, чтобы нижестоящие разработчики не получили неприятного сюрприза. Статичный предмет, однако? Чистый Дикий Запад.
F-ES Sitecore
ГМ ... потокобезопасные статические конструкторы гарантированы .net framework. Вы думаете, что ваш собственный код более надежен, чем фреймворк? Может быть тогда тебе стоит устроиться на работу в Microsoft :)
Nathan Minier
Не строительство, а методы.
F-ES Sitecore
Методы вашего синглтона ничем не отличаются от статических, когда речь заходит о потокобезопасности.
Nathan Minier
..Если я пишу класс, который должен функционировать как синглтон, я удостоверяюсь, что методы (и геттеры/сеттеры) потокобезопасны, чтобы нижестоящие пользователи могли ожидать последовательных операций.
Если я пишу статический класс, я этого не делаю.
Это довольно распространенная модель среди разработчиков фреймворков, судя по моему опыту, поэтому я и предложил это дополнение в первую очередь. Если вы не согласны, это прекрасно, но серьезно.
F-ES Sitecore
Но если бы вы писали статический класс, то сделали бы это в любом случае, не так ли? Вы не можете сказать, что статические классы менее потокобезопасны, потому что, когда вы их пишете, вы не делаете их потокобезопасными. Вы *должны * сделать их потокобезопасными, так как статический класс *должен* быть одноэлементным.
Nathan Minier
Отсюда и слово "вывод", основанное на наблюдении. Но как бы то ни было, развлекайся.