パッケージ名とインスタンス名が同じだと不具合が生じる


クラスファイルをパッケージに振り分けたら、今まで動いていたものが急に動かなくなった。原因は、パッケージ名とインスタンス名の衝突だった。パッケージ名とインスタンス名が同じだと、そのインスタンスが生成されず、しかも、コンパイルエラーは出ない、という現象が起こる。

animal パッケージに Dog クラスがあるとする。

class animal.Dog {
public function Dog() {
trace("ワンワン");
}
}

そして、クライアント側の Test クラス。Dog 型の animal という名のインスタンス変数を持つ。

import animal.*;
class Test {
private var animal:Dog;
public function Test() {
this.animal = new Dog();
trace(this.animal);
}
}

Test クラスのコンストラクタで Dog 型のインスタンスが作られ、”ワンワン”と出力されるはずだが、実際には何も起こらない。また、this.animal を trace しても、undefined となる。インスタンスすら生成されていないらしい。

クラス変数として宣言しても同様に失敗し、唯一、ローカル変数なら生成される。

import animal.*;
class Test {
public function Test() {
var animal:Dog = new Dog(); //ワンワン
}
}

しかし、これでも、いつ不具合が生じるか判らないので、パッケージ名とインスタンス名は最初から別の名前を付けたほうがよい。

同様の不具合の解説は X-LABO さんにも書いてある。こちらはタイムライン変数での検証をされている。

カテゴリー: Flash   パーマリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>