Javaの場合、メソッド内で変更されたくない変数を宣言するときに「final int hoge = 10」とかってしますが、AS3でも同じことが出来るのかなと思い、
public function constant():void{ const array:Array = []; for(var i:int = 0;i < 10000000;i++){ array.push("hoge"); } }
と書いてみたところ、うまくコンパイルできました。
再代入についても、コンパイルエラーを出してくれます。
public function constant():void{ const array:Array = []; for(var i:int = 0;i < 10000000;i++){ array.push("hoge"); } array = null;//再代入エラー }
欠点としては、デバッガーの変数タブで「定数を表示」にチェックを入れないと、変数一覧に出てこないことです。
なお、もしかして性能も上がるのかと思い
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="test()"> <mx:Script> <![CDATA[ import flash.utils.getTimer; private var array:Array = []; private var result:String = ""; public function test():void{ variable(); constant(); member(); result += "\n"; variable(); constant(); member(); result += "\n"; variable(); constant(); member(); result += "\n"; variable(); constant(); member(); result += "\n"; variable(); constant(); member(); result += "\n"; resultText.text = result; } public function variable():void{ var t:int = getTimer(); var array:Array = []; for(var i:int = 0;i < 10000000;i++){ array.push("hoge"); } result+=" var"+(getTimer()-t); } public function constant():void{ const t:int = getTimer(); const array:Array = []; for(var i:int = 0;i < 10000000;i++){ array.push("hoge"); } result+=" con"+(getTimer()-t); } public function member():void{ const t:int = getTimer(); for(var i:int = 0;i < 10000000;i++){ array.push("hoge"); } result+=" mem"+(getTimer()-t); } ]]> </mx:Script> <mx:TextArea id="resultText" width="100%" height="100%"/> </mx:Application>
というコードを書いてみましたが、
var1497 con1435 mem1623 var1560 con1482 mem1544 var1482 con1326 mem1591 var1560 con1592 mem1310 var1654 con1716 mem1341
という感じで、若干ご期待に添えないケースもあるようです。