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

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

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 さんにも書いてある。こちらはタイムライン変数での検証をされている。