読者です 読者をやめる 読者になる 読者になる

AS3のメソッド内final変数

AS3 Flex2 Flex3

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

という感じで、若干ご期待に添えないケースもあるようです。