« get と set | Main | Function/関数/メソッド »
December 28, 2005
コンストラクタ (と Singleton)
コンストラクタはクラス名と同じ名前を持つ関数で、インスタンスを初期化する際に呼び出されます。コンストラクタは初期化時の定型処理を記述するのに使われますが、特に定義されていなくても文法上の問題は有りません。
class SampleClass {
// コンストラクタ定義
public function SampleClass() {
// 初期化処理の記述
}
}
ActionScript では基本的に関数のオーバーロードができないのに倣って、コンストラクタも一つしか定義することができません。コンストラクタを定義する際は、とりあえず引数無しにするか、引数を持つ場合はデフォルト値を指定するというケースが多くなりそうです。
もう一つのコンストラクタの特徴は、返り値の型を指定しないことです。また、AS3 ではコンストラクタのアクセス修飾子として public のみが指定できます。
Singleton
コンストラクタのアクセス修飾子が public のみだと、いくつかのデザインパターンの使用が難しくなります。そこで、シングルトンパターンの実装例を紹介しておきます。(見て分かるようにあまりきれいといえるものではありません)
package pattern {
public class Singleton {
private static var instance:Singleton;
// コンストラクタ定義
// 引数が PrivateClass のインスタンス
public function Singleton(x:PrivateClass) {
}
// Singleton クラスのインスタンスを返す関数
public static function getInstance():Singleton {
if(Singleton.instance == null) {
Singleton.instance = new Singleton(new PrivateClass());
}
return Singleton.instance;
}
}
/* 以下コメントアウト (2006/03/09 追加)
// プライベートクラスの定義
private class PrivateClass {
}
*/
}
// プライベートクラスの定義 (2006/03/09 追加)
class PrivateClass {
}
上記の Singleton クラスはコンストラクタの実行に private クラスへのアクセスが要るため、他のクラスからは引数を正しく指定できません。とりあえず new Singleton() を呼んだとしても、引数の数が違うためコンパイルエラーが出ます。以下は使用例です。
package {
import pattern.Singleton;
public class SingletonTest {
public function SingletonTest() {
var singleton:Singleton = Singleton.getInstance();
}
}
}
Posted by ackie at December 28, 2005 07:54 PM
Comments
> コンストラクタは ...[中略]...、特に定義されていなくても文法上の問題は有りません。
_____
これは、ActionScript 2.0と同様「コンパイラによって空のコンストラクタ関数が自動的に作成され」るということでしょうか?
http://livedocs.macromedia.com/flash/8_jp/main/00001329.html
ActionScript 3.0のドキュメントには、この点を明確に述べた記述が見当たらないようです。
Posted by: 野中 文雄 at August 27, 2006 10:13 PM
こちらでも調べてみましたが明記されたものは見つかりませんでした。ですので、頭の固い回答としては、スペック外ということになるかとは思います。(隠しているとも思えないので、ドキュメントの追加リクエストする価値はあるかと)
実際にランタイムの構造を考えてみると、プロトタイプオブジェクトからクラスオブジェクトへの参照が無いという状況は考えにくいのでどこかのタイミングで何かが自動生成はされているのでしょうね。
Posted by: ackie at August 30, 2006 06:24 PM
やはりありませんか。best practiceとしては、コンストラクタを明示的に記述するということで差支えないのですけど。ActionScript 2.0と仕様が同じなのか違うのかは、やはり気になります。
一応、LiveDocsの方に、コメント入れてみました。
http://livedocs.macromedia.com/labs/as3preview/docs/00000052.html
Posted by: 野中 文雄 at September 1, 2006 04:25 AM
はじめまして。
最近この方法を試してみましたが、以下のエラーが出てコンパイルできないようでした。
[Compiler] Error #1013: The private attribute may be used only on class property definitions.
現状でSingletonを実装しようとすると、野中さんの方法しかなさそうな感じですね。
http://www.fumiononaka.com/TechNotes/Flash/FN0609001.html
Posted by: taka at March 8, 2007 05:16 PM
taka さんこんにちは。
ご指摘ありがとうございます。製品版では仕様が変わりましたので、それに合わせて記事内のコードも変更しておきました。
なお、記事内では触れていませんが、この方法でもコンストラクタの引数に null を指定するとコンパイルできてしまいます。そのため、引数のランタイムチェックをコンストラクタ内に記述することになると思います。
Posted by: ackie at March 9, 2007 01:55 PM
参考までに。同様の仕組みでのシングルトン パターンの実装がAdvanced ActionScript 3 with Design Patternsにも
記載されています。
Posted by: お世話になってます at March 13, 2007 12:31 PM