статический или синглтон?

2 views
Skip to first unread message

Dmitry Zhelnin

unread,
Jan 11, 2008, 4:49:49 AM1/11/08
to ruFlash
hi all,
объясните мне пожалуйста такую вещь:
вот нужно мне написать класс, к которому можно будет обращаться из
разных мест в программе, и я точно знаю что он будет в моем приложении
в одном единственном экземпляре. обычно я пишу в таких случаях
синглтон и использую так:
Singleton.instance.method()
но ведь удобнее написать вместо него полностью статический класс:
StaticClass.method()

от чего должен зависеть выбор способа реализации этого класса?

Nox Noctis

unread,
Jan 11, 2008, 5:11:16 AM1/11/08
to ruF...@googlegroups.com
> от чего должен зависеть выбор способа реализации этого класса?

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

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

Многие считают использование синглтона плохой практикой.
В гугле много статей на эту тему.
http://c2.com/cgi/wiki?SingletonsAreGood
http://c2.com/cgi/wiki?SingletonsAreEvil

У Ярового, кстати, заметка есть на эту тему.
http://yarovoy.com/2007/10/20/singleton_vs_static_members/

--
Michael Antipin
______________________________________________________________________
n...@design.ru | http://www.artlebedev.ru | http://www.noregret.org

Racer

unread,
Jan 11, 2008, 5:21:10 AM1/11/08
to ruFlash
Мне кажется, разница только в "изящности" кода. И удобстве. Возможно и
в производительности.

С одной стороны делать статические методы и оперировать в них с
instance не очень удобно.
А с другой стороны обращаться каждый раз извне к двойной ссылке тоже
не супер.
Способ работы через обращения к instance несколько "приоткрывает"
внутренности класса, что не очень красиво.

Я для внутренних задач использую первый подход
(Singleton.instance.method()). Если класс предназначен для
общественного пользования, я выберу второй во избежание ненужных
вопросов.

Valentin Simonov

unread,
Jan 11, 2008, 5:26:11 AM1/11/08
to ruF...@googlegroups.com
Hi

Конечно правильнее Singleton.getInstance.method(), а сам инстанс спрятать под private или protected.
Насколько я знаю статические свойства класса не наследуются, так что расширять твой класс будет проблематично.
Статические классы удобно использовать для каких-то отдельных связанных утилит, Math класс например.
Плюс еще методы и переменные статического класса создаются сразу и висят в памяти, тогда как синглтон обычно создается при первом обращении к getInstance().

Конечно, АС3 не поддерживает приватных конструкторов, и легко можно сделать экземпляр класса, который планировался как синглтон. Но практика обращения к нему getInstance() поможет избежать ошибки. Если уж очень охото, то есть несколько способов выпендриться и с помощью средств АС3 запретить успешный вызов конструктора, например в параметрах к нему добавить экземпляр класса, который объявляется в том же файле что и синглтон и доступен только ему.

~ valentin
        www.valyard.ru

Dmitry Zhelnin

unread,
Jan 11, 2008, 6:13:25 AM1/11/08
to ruFlash
всем спасибо за ответы, теперь все на своих полочках)
а статью Ярового я в свое время видел, просто как то не придал ей
должного внимания (тогда было не актуально для меня) и забыл. сейчас
она пришлась в самый раз
Reply all
Reply to author
Forward
0 new messages