様々な人が、それぞれの工夫を凝らしているようだが、大きくタイプは二つに分かれるようだ。1つは、internalクラスを用いる方法。実装例はこのようになる。
package {
public class MySingletonA {
private static var _instance:MySingletonA;
public function MySingletonA(a:Blocker) {
}
public static function getInstance():MySingletonA {
if (_instance == null) {
_instance = new MySingletonA(new Blocker());
}
return _instance;
}
}
}
internal class Blocker { }
もう1つは、フラグを用いる方法だ。実装例はこのようになる。
package {
import flash.errors.IllegalOperationError;
public class MySingletonB {
private static var _lock:Boolean = true;
private static var _instance:MySingletonB;
public function MySingletonB() {
if(_lock) {
throw new IllegalOperationError("シングルトンです。");
}
}
public static function getInstance():MySingletonB {
if (_instance == null) {
_lock = false;
_instance = new MySingletonB();
_lock = true;
}
return _instance;
}
}
}
個人的には、前者の方法の方がいいように思える。なぜなら、勝手にインスタンスを作ろうとすると、コンパイル時にエラーになるからだ。一方、後者では、そのコードが実行されるまで、エラーは気づかれない。実装は素直にみえるが、この点が問題になる。
0 件のコメント:
コメントを投稿