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