ActionScript 3.0 では、コンストラクタを、private 宣言することができません。そのために、Singleton なクラスを作るためには、若干の工夫が必要です。

以下は、適当なインターナルクラスを定義しておいて、このインスタンスを使わないと、コンストラクタが呼べないようにするというもの。

package com.kujirahand.utils
{
	public dynamic class KGlobal
	{
		public function KGlobal(key_obj:KGlobalSingletonClass)
		{
			if (!(key_obj is KGlobalSingletonClass)) {
				throw Error("KGlobal is Sigleton.");
			}
			init();
		}
		private static var _instance:KGlobal = null;
		public static function get g():KGlobal
		{
			var g:KGlobal = KGlobal._instance;
			if (g == null) {
				g = new KGlobal(new KGlobalSingletonClass);
				KGlobal._instance = g;
			}
			return g;
		}
		public static function getInstance():KGlobal { return g; }
		private function init():void
		{
			// init
		}
	}
}
internal class KGlobalSingletonClass {} // for singleton

かなり、凝ったコードだけど、結局は、throw Error() を使って、シングルトンであることを外部に通知しています。そのため、もっと簡略化しても同じなのでは、と思って調べてみたら、みんな似たり寄ったりなことをしていました。

以下は、private なオブジェクトを定義しておいてクラス生成のためのキーにしています。キーが合わないとエラーを出すというもの。結局、throw Error()を使うという部分は同じ。

package com.kujirahand.utils
{
	public dynamic class KGlobal
	{
		private static var _SINGLETON_KEY:Object = {};
		public function KGlobal(key_obj:Object)
		{
			if (key_obj != _SINGLETON_KEY) {
				throw Error("KGlobal is Sigleton.");
			}
			init();
		}
		private static var _instance:KGlobal = null;
		public static function get g():KGlobal
		{
			var g:KGlobal = KGlobal._instance;
			if (g == null) {
				g = new KGlobal(_SINGLETON_KEY);
				KGlobal._instance = g;
			}
			return g;
		}
		public static function getInstance():KGlobal { return g; }
		private function init():void
		{
			// init
		}
	}
}

どちらかといえば、こちらの方が見た目に分かりやすいと思いましたが、好みの問題でしょうか。

コメント
お名前:
 


作成:2008-02-18 15:58:34/更新:2008-02-18 16:09:58

→テキスト形式で見る

くじらぶろぐD by kujirahand RSS

konawiki 0.23