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

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

Оценить эту запись

Инициализатор класса

Запись от Яски размещена 05.11.2009 в 23:13

Сегодня обнаружил, что совсем не обязательно писать код внутри функций. Его можно писать внутри класса, вне класса и вне пакета. Такой код выполнится во время инициализации класса, т.е. при первом обращении к нему.
Простейший пример:
Код AS3:
package tst{
 
    public class Test {
 
    	private static var instance:Test;
 
	trace("Вызываем в классе");
 
	instance = new Test();
 
	public function Test() {
		if (instance) {
			throw new Error("Singleton!!!");
		}
	}
 
    }
	trace("Вне класса");
 
}
trace("Вне пакета");
Он будет выполняться в том порядке, в каком записан в файле.
Применений для этого опять же немного, можно инициализировать статические переменные, но я для этого предпочитаю другой подход — для каждого статического свойства вызывать метод, который вернет начальное значение. Тут можно и константам устанавливать значение.
Например:
Код AS3:
package tst{
 
    public class Test {
 
    	private static const invalidBmd:BitmapData = createInvalidBmd();
 
    	private static function createInvalidBmd():BitmapData {
    		return new BitmapData(10, 10, false, 0xFF000000);
	}
 
    }
}
Размещено в Action Script 3
Комментарии 4 Отправить другу ссылку на эту запись
Всего комментариев 4

Комментарии

Старый 13.11.2009 06:15 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
В догонку к экспериментам, вот еще один интересный тест для любителей всяких пасхальных яиц и т.п.
Код AS3:
package tests 
{
	/**
	 * FunnySingleton class.
	 * @author wvxvw
	 * @langVersion 3.0
	 * @playerVersion 10.0.32
	 */
	public class FunnySingleton
	{
		private static var _instantiated:Boolean;
 
		public function FunnySingleton() 
		{
			super();
			if (_instantiated) throw new Error("Some big and nasty error.");
			_instantiated = true;
			trace("Cogno ergo sum!");
		}
	}
}
import tests.FunnySingleton;
new FunnySingleton();
Инструкции по компиляции:
Код:
SET sdk=C:\flex_sdk_trunk\bin\compc.exe
SET buildfile=C:\www\projects\xmlhelpers\run\build-singleton.xml
SET outputfile=C:\www\projects\xmlhelpers\bin\singleton.swc
SET exec=%sdk% -load-config+=%buildfile% -debug=true -benchmark=false -output=%outputfile% -compute-digest=false
CALL %exec%
pause
Код:
<?xml version="1.0" encoding="utf-8"?>
<flex-config>
  <compiler>
    <source-path append="true">
      <path-element>C:\www\projects\xmlhelpers\src</path-element>
      <path-element>C:\Program Files\FlashDevelop\Library\AS3\classes</path-element>
    </source-path>
  </compiler>
  <include-classes>
	<class>tests.FunnySingleton</class>
  </include-classes>
</flex-config>
Тест:
Код AS3:
package tests 
{
	//{ imports
	import flash.display.Sprite;
	//}
 
	/**
	 * TestSingleton class.
	 * @author wvxvw
	 * @langVersion 3.0
	 * @playerVersion 10.0.32
	 */
	public class TestSingleton extends Sprite
	{
		public function TestSingleton()
		{
			super();
			new FunnySingleton();
			/*
			Error: Some big and nasty error.
			at tests::FunnySingleton()[C:\www\projects\xmlhelpers\src\tests\FunnySingleton.as:16]
			at tests::TestSingleton()[C:\www\projects\xmlhelpers\src\tests\TestSingleton.as:18]
			*/
		}
	}
 
}
Инструкции к компиляции:
Код:
SET sdk=C:\flex_sdk_trunk\bin\mxmlc.exe
SET buildfile=C:\www\projects\xmlhelpers\run\build-test-singleton.xml
SET outputfile=C:\www\projects\xmlhelpers\bin\singletone-test.swf
SET exec=%sdk% -load-config+=%buildfile% -debug=true -incremental=true -benchmark=false -output=%outputfile%
CALL %exec%
pause
Код:
<?xml version="1.0" encoding="utf-8"?>
<flex-config>
	<compiler>
	<source-path append="true">
		<path-element>C:\www\projects\xmlhelpers\src</path-element>
		<path-element>C:\Program Files\FlashDevelop\Library\AS3\classes</path-element>
	</source-path>
	<include-libraries>
		<library>C:\www\projects\xmlhelpers\bin\singleton.swc</library>
	</include-libraries>
	</compiler>
	<file-specs>
		<path-element>C:\www\projects\xmlhelpers\src\tests\TestSingleton.as</path-element>
	</file-specs>
	<default-background-color>#FFFFFF</default-background-color>
	<default-frame-rate>30</default-frame-rate>
	<default-size>
		<width>800</width>
		<height>600</height>
	</default-size>
</flex-config>
Старый 13.11.2009 07:46 Яски вне форума
Яски
А mxmlc.exe первый вариант не может скомпилить? Или для swc нужно compc использовать?
Старый 13.11.2009 14:10 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Старый 13.11.2009 17:23 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Да, может, только SWF не запустится - будет ругаться, что FunnySingleton не является визуальным классом и не может по этому быть прилинкован к руту.
Хотя, если подумать. Нет принципиальной разницы в том, где инициализировать класс. Просто таким образом можно создать проблемы тому, кто будет декомпилировать, а потом собирать флешку по частям. Т.как никаких прямых указаний на этот класс не будет и после повторной компиляции он не попадет в SWF.
 

 


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


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