Форум Flasher.ru

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

Appleman 27.11.2017 16:56

Цитата:

Сообщение от ZergMaster (Сообщение 1203154)
Хоть, как завещал дедушка Мартин, это и не тру, конечно, пользоваться флагами, но зато тут не создать, опять же, экземпляр из вне.

Поясните для чайника, плиз, что это за ситуация создания экземпляра извне? Мне представлялось, что откуда бы не создавался экземпляр, нельзя не запустить его конструктор. Или я ошибаюсь?

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

undefined 27.11.2017 17:02

статичный класс будет жить все время, пока работает приложение, а синглтоны можно создавать и удалять когда угодно.
Цитата:

Поясните для чайника, плиз, что это за ситуация создания экземпляра извне? Мне представлялось, что откуда бы не создавался экземпляр, нельзя не запустить его конструктор. Или я ошибаюсь?
Имеется в виду извне класса синглтона.Каноническая реализация сама создает экземпляр себя и предоставляет его всем желающим.Повторное создание со стороны блокируется модификатором private у конструктора синглтона.

Wolsh 27.11.2017 17:08

Класс не может диспатчить события.

caseyryan 27.11.2017 17:15

Цитата:

Сообщение от ZergMaster (Сообщение 1203154)
это да. Не нравится мне так, непорядок. Я не гонюсь за коротким кодом с некоторых пор... ) А вот аккуратненько все должно быть и по полочкам - это желательно по возможности.
Если уж на то пошло, тогда мне больше нравится такой вариант:

Код AS3:

package {
 
        public class MySingleton {
 
                private static var _instance:MySingleton;
                //Переменная доступа
                private static var _isConstructing:Boolean;
 
                public function MySingleton() {
                        if (!_isConstructing) throw new Error("Singleton, use MySingleton.instance");
                }
 
                public static function get instance():MySingleton {
                        if (_instance == null)  {
                                _isConstructing = true;
                                _instance = new MySingleton();
                                _isConstructing = false;
                        }
                        return _instance;
                }
        }
}

Хоть, как завещал дедушка Мартин, это и не тру, конечно, пользоваться флагами, но зато тут не создать, опять же, экземпляр из вне.


А что такое? Детская травма?)

Ну тогда этот вариант тоже надо доделать. Потому что сейчас он позволяет сделать так:
Код AS3:

MySingleton.instance;
new MySingleton();
new MySingleton();
new MySingleton();

Если дополнить конструктор вот так:
Код AS3:

public function MySingleton() {
        if (!_isConstructing || _instance) throw new Error("Singleton, use MySingleton.instance");
        _instance = this;
}

То будет уже лучше

ZergMaster 27.11.2017 17:19

Цитата:

Сообщение от undefined (Сообщение 1203155)
Это что защита для многопоточности? :)

Это как раз приватизация конструктора так сказать)

Цитата:

Сообщение от Appleman (Сообщение 1203156)
Какой кайф создавать синглтоны

кайф, чтобы у тебя был объектик.=) Так и на сердце спокойней, и диспатчить можно из него, и интерфейсы применять к нему, и удалять. И в целом приятнее.

Добавлено через 2 минуты
caseyryan
пожалуй! Хотя кем жеж это надо быть, чтобы изнутри этого класса пытаться создавать множество инстансов)) Эдак себя бить себя по рукам постоянно надо. )
А извне то все равно больше одного не создашь.

undefined 27.11.2017 17:48

Код AS3:

Это как раз приватизация конструктора так сказать)

в чем смысл наличия флага isConstructing?

ZergMaster 27.11.2017 18:04

Цитата:

Сообщение от undefined (Сообщение 1203162)
Код AS3:

Это как раз приватизация конструктора так сказать)

в чем смысл наличия флага isConstructing?

ну как...Там же все понятно вроде. Это приватная boolean переменная, которая может быть изменена только изнутри класса. По умолчанию она равна false.
Код AS3:

private static var _isConstructing:Boolean;

В конструкторе стоит её проверка, которая выдает ошибку при попытке создать экземпляр класса
Код AS3:

public function MySingleton() {
                        if (!_isConstructing) throw new Error("Singleton, use MySingleton.instance");
                }

что и ограничивает создание конструктора извне класса, так как данную переменную изменить можно только изнутри. Что мы и делаем в геттере instance, единожды разрешая создание конструктора.

Код AS3:

public static function get instance():MySingleton {
                        if (_instance == null)  {
                                _isConstructing = true;
                                _instance = new MySingleton();
                                _isConstructing = false;
                        }
                        return _instance;
                }

причем данная операция выполняется только если переменная _instance не определена, если же экземпляр уже был создан, т1о мы просто возвращаем его, не трогая переменную _isConstructing, которая по прежнему, пребывая в false, ограничивает создание экземпляра данного класса извне.

Tails 27.11.2017 18:17

Если в описаний класса указано что он - синглтон, а кто-то всё равно пытается использовать его как-то иначе, то этому человеку уже ничего не поможет..

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

Appleman 27.11.2017 18:19

Цитата:

Сообщение от ZergMaster (Сообщение 1203119)
у меня для этой задачи служит такой классик:

Код AS3:

 
        public function registerObject(object:Sprite, description:String):void
                {
                        _bubbleObjects[object] = {target:object, description:description};
 
                        if (!_stage.hasEventListener(MouseEvent.MOUSE_OVER))
                        {
                                _stage.addEventListener(MouseEvent.MOUSE_OVER, mouseOverOutHandler, true);
                                _stage.addEventListener(MouseEvent.MOUSE_OUT, mouseOverOutHandler, true);
                        }
                }


ZergMaster, а в чём преимущество такого метода - вешать слушатель на весь слой, перед навешиванием слушателей непосредственно на регистрируемые объекты?

undefined 27.11.2017 18:20

Цитата:

В конструкторе стоит её проверка, которая выдает ошибку при попытке создать экземпляр класса
так, а зачем ее сначала в true выставлять,и тут же в false?
обычно делают так:
Код AS3:

private var _instance:MySingleton;
private function MySingleton() {
...
}
public static function getInstance():MySingleton {
    if (!_instance) _instance=new MySingleton();
    return _instance;
}

и никакие флаги не нужны


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

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