Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Котяра

Рейтинг: 5.00. Голосов: 2.

Нужны ошибки компиляции при создании экземпляра синглетона извне? Запросто!

Запись от Котяра размещена 13.09.2013 в 00:51
Обновил(-а) Котяра 13.09.2013 в 15:17

Саму идею синглетонов не очень люблю, и очень редко их использую, но тут в курилке товарищ подсказал способ, как в as3 сделать не рантайм еррор при создании экземпляра синглетона, а ошибку компиляции.
Собственно, расписывать код не буду - проще показать:
Код AS3:
package  {
 
	public class Singleton {
		private static var _instance:Singleton;
 
		public var value:int = 1;
 
		public function Singleton(protector:Protector) 	{
		}
 
		static public function get instance():Singleton {
			if (!_instance)
				_instance = new Singleton( new Protector());
 
			return _instance;
		}
 
	}
 
}
 
internal class Protector{
 
	public function Protector() {
		super();
	}
}
пробуем

Код AS3:
trace (Singleton.instance.value); // 1
а вот тут ошибка компиляции, т.к. никому кроме синглетона,
не получить доступ к классу Protecor

Код AS3:
var s:Singleton = new Singleton();

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

UPD
Особо кривые ручки всё равно обойдут этот приём написав
Код AS3:
var s:Singleton = new Singleton(null);
Тут можно, конечно, проверять параметр в конструкторе на null, но это будет уже не то..
Печаль
Всего комментариев 10

Комментарии

Старый 13.09.2013 01:05 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Уже видел ранее этот вариант, но только сейчас въехал, что вся прелесть в ошибке на этапе компиляции!
Спасибо.
Старый 13.09.2013 01:12 GBee вне форума
GBee
 
Аватар для GBee
Прикольно.
Старый 13.09.2013 10:19 Tails вне форума
Tails
 
Аватар для Tails
Такой же пример синглтона описывается в книге Шаблонов проектирования
Очень удобный способ, использую его при необходимости.

пс. Да и ещё нужно добавить проверку на передачу в конструктор null.
Обновил(-а) Tails 13.09.2013 в 10:37
Старый 13.09.2013 12:41 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Цитата:
пс. Да и ещё нужно добавить проверку на передачу в конструктор null.
Ошибка уже будет во время выполнения, чего собственно Котяра и пытался избежать.
В принципе можно перенести логику синглтона во внутренний класс (своего рода приватный конструктор):
Код AS3:
package  
{
	public class Singleton
	{
		static public function get instance():SingletonImpl
		{
			return _instance||= new SingletonImpl();
		} 
	}
 
}
var _instance:SingletonImpl;
 
class SingletonImpl
{ 
	public function get value():int
	{
		return 1;
	}
}
Минусом такого синглтона является невозможность записать его в переменную, чтобы можно было передать в функцию или просто сохранить, чтобы постоянно не дергать getInstance(), в котором плюс ко всему постоянная проверка. В принципе это тоже можно исправить если использовать интерфейсы. Класс пустышка (Singleton) тоже не радует, хотя его и можно заменить на функцию или геттер, но я не уверен стоит ли так делать. Вот так пытаемся мимикрировать под полностью статический класс:
Код AS3:
package
{
	public function get SoundManager():ISoundManager
	{
		return _instance||= new SoundManagerImpl();
	}
}
 
import flash.media.Sound;
 
var _instance:SoundManagerImpl;
class SoundManagerImpl implements ISoundManager
{
	public function playSound(value:Sound):void
	{
		//...
	}
}
//...
SoundManager.playSound(mySound);
var soundManager:ISoundManager = SoundManager;// или getSoundManager();
Последнее время пытаюсь перестать использовать синглтоны вообще.
Понятное дело:
Код AS3:
new SoundManager();
в таком случае не скомпилится
Старый 13.09.2013 15:20 Котяра вне форума
Котяра
 
Аватар для Котяра
2InetPC - твой вариант крут.
тем более, что
Код AS3:
SoundManager.playSound(mySound);
гораздо лучше выглядит чем
Код AS3:
SoundManager.instance.playSound(mySound);
Старый 13.09.2013 15:52 Tails вне форума
Tails
 
Аватар для Tails
Постоянное обращение к статическому классу не затратное действие? Вроде-бы это последняя область поиска определения.
Старый 13.09.2013 16:37 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Tails, не представляю себе синглтон в качестве класса для реализации задач с жесткими требованиями к производительности. Статик пойдет.
Старый 13.09.2013 17:01 Tails вне форума
Tails
 
Аватар для Tails
Ну да, так-то
Цитата:
SoundManager.playSound(mySound);
Очень симпатично выглядит.
Старый 13.09.2013 20:32 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
@Tails

Код AS3:
public class BaseClass {
	protected static const SFX:SoundManager = SoundManager.inst;
 
}
 
public class SomeClass extends BaseClass {
	public function play(sound:SomeSound):void {
		// Еще симпатичнее
		SFX.playSound(sound);
	}
 
}
Плодите SomeClass-ов хоть тысячи или раширяйте BaseClass и плодите других наследников, но ссыль на синглтон будет одна и всем доступна и... симпатична
Старый 13.09.2013 23:32 dimarik вне форума
dimarik
 
Аватар для dimarik
Ээээ это баян ппц какой давности.
 

 


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


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