パッケージ名とインスタンス名が同じだと不具合が生じる
March 10, 2006category: Flash
クラスファイルをパッケージに振り分けたら、今まで動いていたものが急に動かなくなった。原因は、パッケージ名とインスタンス名の衝突だった。パッケージ名とインスタンス名が同じだと、そのインスタンスが生成されず、しかも、コンパイルエラーは出ない、という現象が起こる。
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 さんにも書いてある。こちらはタイムライン変数での検証をされている。

comments