Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Синглтон :) АС3 возможно? (http://www.flasher.ru/forum/showthread.php?t=102937)

Artureg 25.10.2007 22:26

Синглтон :) АС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;
                }
       
        }
}


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/single...ctionscript_3/
http://yarovoy.com/2007/10/20/single...tatic_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

Цитата:

Сообщение от __etc
1. Можно инициализировать раньше любого кода и тогда создавать новые экземпляры нельзя будет;

Вариант, делается он просто
Код:

private static var _instance:SingletonExample = new SingletonExample();
Правда мы лишаемся ленивой инициализации, а если она нам не важна, то можно вообще воспользовать all-static классом ;)
Цитата:

Сообщение от __etc
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

Цитата:

Сообщение от Artureg
Вообще чем руководствовались разработчики ас3 добавляя фичу, запрещающую делать конструкторы приватными

вот еще можно почитать на эту тему:
http://kuwamoto.org/2006/04/05/as3-o...d-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

Цитата:

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

Изначально было 2 года назад.
Не суть, просто не стоит допускать путаницы, BlooDHounD носит этот аватар уже очень давно.

Artureg 26.10.2007 20:30

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


Часовой пояс GMT +4, время: 01:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.