コンストラクタ (と 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();
    }
  }
}

コメント(6)

> コンストラクタは ...[中略]...、特に定義されていなくても文法上の問題は有りません。
_____
これは、ActionScript 2.0と同様「コンパイラによって空のコンストラクタ関数が自動的に作成され」るということでしょうか?
http://livedocs.macromedia.com/flash/8_jp/main/00001329.html

ActionScript 3.0のドキュメントには、この点を明確に述べた記述が見当たらないようです。

こちらでも調べてみましたが明記されたものは見つかりませんでした。ですので、頭の固い回答としては、スペック外ということになるかとは思います。(隠しているとも思えないので、ドキュメントの追加リクエストする価値はあるかと)
実際にランタイムの構造を考えてみると、プロトタイプオブジェクトからクラスオブジェクトへの参照が無いという状況は考えにくいのでどこかのタイミングで何かが自動生成はされているのでしょうね。

やはりありませんか。best practiceとしては、コンストラクタを明示的に記述するということで差支えないのですけど。ActionScript 2.0と仕様が同じなのか違うのかは、やはり気になります。

一応、LiveDocsの方に、コメント入れてみました。
http://livedocs.macromedia.com/labs/as3preview/docs/00000052.html

はじめまして。

最近この方法を試してみましたが、以下のエラーが出てコンパイルできないようでした。

[Compiler] Error #1013: The private attribute may be used only on class property definitions.

現状でSingletonを実装しようとすると、野中さんの方法しかなさそうな感じですね。
http://www.fumiononaka.com/TechNotes/Flash/FN0609001.html

taka さんこんにちは。
ご指摘ありがとうございます。製品版では仕様が変わりましたので、それに合わせて記事内のコードも変更しておきました。
なお、記事内では触れていませんが、この方法でもコンストラクタの引数に null を指定するとコンパイルできてしまいます。そのため、引数のランタイムチェックをコンストラクタ内に記述することになると思います。

参考までに。同様の仕組みでのシングルトン パターンの実装がAdvanced ActionScript 3 with Design Patternsにも
記載されています。

コメントする

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261