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
}
}
}どちらかといえば、こちらの方が見た目に分かりやすいと思いましたが、好みの問題でしょうか。