パッケージ名とインスタンス名のバッティング
パッケージ名と同じインスタンス名を利用し、かつそのインスタンスから同パッケージに属する他のクラスを呼び出そうとすると、その時点で処理がぷっつり止まってしまう、という現象が起きます。この現象は忘れた頃にたまに引っかかり頭を悩まされます。
詳細は次の通り。
sampleパッケージに属するCheckクラスとReadクラスがあるとします。
//Check.as import sample.Read; class sample.Check{ public function Check(){ trace( "checkA" ); } public function test():Void{ trace( "checkB" ); var read:Read = new Read(); } } //Read.as class sample.Read{ public function Read(){ trace( "checkC" ); } }
CheckクラスからはReadクラスのコンストラクタを呼び出しています。
次にタイムラインからCheckクラスのオブジェクトをインスタンス名sampleで作成し処理を呼び出します。
import sample.Check; var sample:Check = new Check(); sample.test(); trace( "checkD" );
これを実行しますと一見、checkA checkB checkC checkD と出力されそうですが、実際は
checkA
checkB
と出力して止まります。
Check.testメソッドからReadクラスのオブジェクトを作成している行をコメントアウトすると
checkA
checkB
checkD
と、期待通りの動作を行います。
また、インスタンス名をsampleではなくsampleObj等にすれば、checkA~checkDまで順番に出力されます。
原因は色々あるのでしょうけれども ひとまず、パッケージ名と同じインスタンス名を使用するのは危険なので禁止ということで。この途中で止まると言う中途半端さが問題点を見つけにくくしていて まどろっこしかです。