PDA

Просмотр полной версии : Синглтон :) АС3 возможно?


Artureg
25.10.2007, 22:26
Будет ли этот код соответсвовать аналогичному коду в 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;
}

}
}

Nirth
25.10.2007, 23:00
Так нельзя. В флексе есть пути обхода для синглтонов.

Приватные конструкторы запрещены.

Artureg
25.10.2007, 23:02
А без использования флекса?
А если сделать конструктор пабликом но сознательно его не вызывать?

Nirth
25.10.2007, 23:16
но сознательно его не вызывать?
Так и делают. можно еще залочить конструктор.

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;
}
}
}
}

Artureg
25.10.2007, 23:20
Спасибо, это лишнее. Если достаточно просто не обращатся к конструктору напрямую, это будет в самый раз.

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/

Artureg
25.10.2007, 23:38
Спасибо

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: очипятался

Nirth
26.10.2007, 01:44
Например SharedObject не генерит ошибки, хотя синглтон
SharedObject это не Singleton это Multiton.

Пример с локом легко трансформируется в Multiton.

BlooDHounD
26.10.2007, 02:46
извините :) не знал :) один фиг лок лишний.

vooparker
26.10.2007, 10:36
как это так лок лишний? при синглетоне вообще не должно существовать возможности создать больше одного экземпляра, а в приведенном примере через конструктор их можно создавать сколько угодно, при этом в случае синглетона вообще создать через конструктор экземпляр вне класса не возможно. Но опять же это все справедливо если вы хотите реализовать синглетон в чистом виде.

ЗЫ: еще не понял как геттер может принимать параметры, видимо опечатка?

etc
26.10.2007, 10:47
Либо параметр лишний, либо 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();
}
}
}

Artureg
26.10.2007, 13:44
1. Если интстанс ещё не создан, то создать обьект данного класса через конструктор возможно? Зачем?
2. Какой смысл в данном примере писать super() в конструкторе?
3. Зачем ретурн после throw...
4. Вообще какой ретурн в кострукторе о.О
5. В getInstance очень часто требуется передаь параметры, при такой записи вроде бы это не возможно?

Я так осторожно выражаюсь :) Но с точки зрения меня как жависта этот пример полная херня :)

vooparker
26.10.2007, 13:56
2BloodHoud: а ты попробуй создать экземпляр своего класса до обращения к геттеру

ЗЫ: А super() в данном пример будет генерить ошибку

etc
26.10.2007, 15:48
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.

Artureg
26.10.2007, 16:13
Вообще чем руководствовались разработчики ас3 добавляя фичу, запрещающую делать конструкторы приватными :)
В мою голову не укладывается, зачем это было нужно и какие подводные камни может вызвать приватный конструктор. Если уж сдирать всё с жавы, так сдирать целиком :) Имхо.


Error: A super statement cannot occur after a this, super, return, or throw statement.
Вот и я про тоже :)

etc
26.10.2007, 16:15
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

Artureg
26.10.2007, 16:38
Ну ппц, конечно :) лучше запретить приватные конструкторы и перегрузку чем доработать систему классов.
Оказывается АС3 ещё очень сырой, и его будут дорабатывать, глядишь через год можно будет делать человеческие синглтоны :)

Nirth
26.10.2007, 17:19
Ну ппц, конечно лучше запретить приватные конструкторы и перегрузку чем доработать систему классов.
Оказывается АС3 ещё очень сырой, и его будут дорабатывать, глядишь через год можно будет делать человеческие синглтоны
Дело не в АС, дело в ECMA, почему то люди придумавшие стандарт ECMA сказали что приватных конструкторов не существует. А мы страдаем.

Artureg
26.10.2007, 17:35
Судя по тому что написано под ссылкой товарища vooparker разработчики ЕСМА подозревают о том что во всём цивилизованом мире приватные конструкторы существуют, но внедрить эту фичу в свой стандарт им не позволило время и религия. Но они обещаются доработать ЕСМУ :)

etc
26.10.2007, 19:24
Artureg, аватар у BlooDHounD на этом форуме фирменный вообще-то :D

Artureg
26.10.2007, 19:27
Так и знал что заметят :))
Я перересовал этот аватар 2,5 года назад :) Могу доказать :)

etc
26.10.2007, 20:21
Так и знал что заметят :))
Я перересовал этот аватар 2,5 года назад :) Могу доказать :)
Изначально было 2 года назад.
Не суть, просто не стоит допускать путаницы, BlooDHounD носит этот аватар уже очень давно.

Artureg
26.10.2007, 20:30
А я точно вспомнил когда создавал :)
Оке сменю :) нет проблем)