Просмотр полной версии : Синглтон :) АС3 возможно?
Будет ли этот код соответсвовать аналогичному коду в Java?
т.е. будет ли создаватся только один екземпляр данного класса? Или у АС3 свои правила написания синглтона?
package kos.util{
public class Imager{
private var imager:Imager = null;
private function Imager(){}
static public function getInst():Imager{
if (imager==null)
imager = new Imager();
return imager;
}
}
}
Так нельзя. В флексе есть пути обхода для синглтонов.
Приватные конструкторы запрещены.
А без использования флекса?
А если сделать конструктор пабликом но сознательно его не вызывать?
но сознательно его не вызывать?
Так и делают. можно еще залочить конструктор.
package com.seeqpod.services
{
public class SingletonExample
{
public static function get instance():SingletonExample
{
if(_instance == null)
{
locked = false;
_instance = new SingletonExample();
locked = true;
}
return _instance;
}
private static var _instance:SingletonExample = null;
private static var locked:Boolean = true;
public function SingletonExample()
{
if(SingletonExample.locked)
{
throw new Error('this is Signleton class, use instance property instead');
return;
}
}
}
}
Спасибо, это лишнее. Если достаточно просто не обращатся к конструктору напрямую, это будет в самый раз.
vooparker
25.10.2007, 23:28
вот ссылки в тему:
http://yarovoy.com/2007/10/24/singleton_in_actionscript_3/
http://yarovoy.com/2007/10/20/singleton_vs_static_members/
BlooDHounD
26.10.2007, 01:08
с локом странный пример :)
зачем лок, если можно проверяеть есть ли экземпляр?
Кстати генерация ошибки не всегда нужна.
Например SharedObject не генерит ошибки, хотя синглтон :)package {
public class SingletonExample {
private static const _instances:Dictionary = new Dictionary();
public static function getInstance(param:Object):SingletonExample {
var instance:SingletonExample = _instances[param];
if (!instance) {
_instances[param] = instance = new SingletonExample();
instance.init(param);
}
return instance;
}
public function SingletonExample() {
super();
}
private function init(param:Object):void {
// инициализация
}
}
}UPD: очипятался
Например SharedObject не генерит ошибки, хотя синглтон
SharedObject это не Singleton это Multiton.
Пример с локом легко трансформируется в Multiton.
BlooDHounD
26.10.2007, 02:46
извините :) не знал :) один фиг лок лишний.
vooparker
26.10.2007, 10:36
как это так лок лишний? при синглетоне вообще не должно существовать возможности создать больше одного экземпляра, а в приведенном примере через конструктор их можно создавать сколько угодно, при этом в случае синглетона вообще создать через конструктор экземпляр вне класса не возможно. Но опять же это все справедливо если вы хотите реализовать синглетон в чистом виде.
ЗЫ: еще не понял как геттер может принимать параметры, видимо опечатка?
Либо параметр лишний, либо getInstance должно быть.
†‡Paladin‡†
26.10.2007, 10:51
Сорри если оффтоп, но че так все носятся с этим синглтоном?
vooparker
26.10.2007, 11:01
А он самый простой из паттернов =) и позволяет знающему его заявлять о своей мегакомпетентности =)
†‡Paladin‡†
26.10.2007, 11:14
Аааа. Лишняя строчка к резюме это гут =)
BlooDHounD
26.10.2007, 11:24
ну так мне кто-нить объяснит зачем нужен лок?
vooparker
26.10.2007, 11:57
var singleton:SingletonExample = new SingletonExample();
При реализации синглетона в чистом виде такая конструкция не возможна. Невозможность ее обеспечивается вбросом исключения в конструкторе. Чтобы исключение не возникало внутри класса, а только при попытке вызвать конструктор извне и используется лок.
BlooDHounD
26.10.2007, 13:31
вы издеваетесь? я ниразу не видел что бы использовался лок.package {
public class SingletonExample {
private static var _instance:SingletonExample;
public static function get instance():SingletonExample {
if (!_instance) {
_instance = new SingletonExample();
}
return _instance;
}
public function SingletonExample() {
if (_instance) {
throw new Error('this is Signleton class, use instance property instead');
return;
}
super();
}
}
}
1. Если интстанс ещё не создан, то создать обьект данного класса через конструктор возможно? Зачем?
2. Какой смысл в данном примере писать super() в конструкторе?
3. Зачем ретурн после throw...
4. Вообще какой ретурн в кострукторе о.О
5. В getInstance очень часто требуется передаь параметры, при такой записи вроде бы это не возможно?
Я так осторожно выражаюсь :) Но с точки зрения меня как жависта этот пример полная херня :)
vooparker
26.10.2007, 13:56
2BloodHoud: а ты попробуй создать экземпляр своего класса до обращения к геттеру
ЗЫ: А super() в данном пример будет генерить ошибку
1. Можно инициализировать раньше любого кода и тогда создавать новые экземпляры нельзя будет;
2. Можно не писать, если не хочется;
3. Артефакт от кода Nirth-а;
4. А что смущает? Выполнили часть конструктора и хорош;
5. геттер или метод *— это зависит от конкретной задачи.
vooparker, какую ошибку?
vooparker
26.10.2007, 15:57
1. Можно инициализировать раньше любого кода и тогда создавать новые экземпляры нельзя будет;
Вариант, делается он просто
private static var _instance:SingletonExample = new SingletonExample();
Правда мы лишаемся ленивой инициализации, а если она нам не важна, то можно вообще воспользовать all-static классом ;)
vooparker, какую ошибку?
Error: A super statement cannot occur after a this, super, return, or throw statement.
Вообще чем руководствовались разработчики ас3 добавляя фичу, запрещающую делать конструкторы приватными :)
В мою голову не укладывается, зачем это было нужно и какие подводные камни может вызвать приватный конструктор. Если уж сдирать всё с жавы, так сдирать целиком :) Имхо.
Error: A super statement cannot occur after a this, super, return, or throw statement.
Вот и я про тоже :)
vooparker, а, ты про это. Я думал про другое =)
Artureg, следование стандартам ECMAScript, надо полагать.
vooparker
26.10.2007, 16:22
Вообще чем руководствовались разработчики ас3 добавляя фичу, запрещающую делать конструкторы приватными
вот еще можно почитать на эту тему:
http://kuwamoto.org/2006/04/05/as3-on-the-lack-of-private-and-protected-constructors
Ну ппц, конечно :) лучше запретить приватные конструкторы и перегрузку чем доработать систему классов.
Оказывается АС3 ещё очень сырой, и его будут дорабатывать, глядишь через год можно будет делать человеческие синглтоны :)
Ну ппц, конечно лучше запретить приватные конструкторы и перегрузку чем доработать систему классов.
Оказывается АС3 ещё очень сырой, и его будут дорабатывать, глядишь через год можно будет делать человеческие синглтоны
Дело не в АС, дело в ECMA, почему то люди придумавшие стандарт ECMA сказали что приватных конструкторов не существует. А мы страдаем.
Судя по тому что написано под ссылкой товарища vooparker разработчики ЕСМА подозревают о том что во всём цивилизованом мире приватные конструкторы существуют, но внедрить эту фичу в свой стандарт им не позволило время и религия. Но они обещаются доработать ЕСМУ :)
Artureg, аватар у BlooDHounD на этом форуме фирменный вообще-то :D
Так и знал что заметят :))
Я перересовал этот аватар 2,5 года назад :) Могу доказать :)
Так и знал что заметят :))
Я перересовал этот аватар 2,5 года назад :) Могу доказать :)
Изначально было 2 года назад.
Не суть, просто не стоит допускать путаницы, BlooDHounD носит этот аватар уже очень давно.
А я точно вспомнил когда создавал :)
Оке сменю :) нет проблем)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.