クラスメンバの記述順序に依存してしまう書き方と、依存させない方法
まぁちょぃとこのコードを見てください。クラスメンバで定数を定義して、クラスメンバでそれを代入するコードです。
package { import flash.display.*; public class Main extends Sprite { private const constant:Object = {}; private var variable:Object = constant; function Main() {trace(variable);} } }
これ、何が出力されるでしょう?正解は[object Object]です。
では、こちらは何が出力されるでしょう?メンバの順序を入れ替えただけです。
package { import flash.display.*; public class Main extends Sprite { private var variable:Object = constant; private const constant:Object = {}; function Main() {trace(variable);} } }
正解はnullです。まぁ何らかのclass-based OOP言語をやった人なら分かると思いますが、
variableに代入する時点ではconstantが初期化されてないわけですね。
ところで、constメンバをインスタンス変数にしておく理由はないので普通はstaticにします。(参考までにwonderfl build flash online | 面白法人カヤック)
private var variable:Object = constant; - private const constant:Object = {}; + private static const constant:Object = {};
この状態なら、variableを先に書いても問題無いですね。インスタンス変数より静的変数の方が先に初期化されますから。
しかし、だからと言って
- private var variable:Object = constant; + private static var variable:Object = constant; private static const constant:Object = {};
なんてことをしてどちらもstaticにしてしまうと、また順序に依存するようになってvariableの方を先に書くとnullになってしまいます。
スコープが同じなので記述順序がそのまま初期化順序になってしまうからですね。
こういう記述順序に依存しないためにはどうすればいいのかなー。
で、とりあえず思いついた案は別クラスに外出しすること。
package { import flash.display.*; public class Main extends Sprite { private static var variable:Object = MainConst.constant; function Main() {trace(variable);} } } /* MainConst.as */ package { class MainConst { public static const constant:Object = {}; } }