イナヅマTVログ

ActionScript 3, 定数のように扱える配列型変数のお勉強

| 1件のコメント

前投稿での「ActionScript 3, 配列を定数にしても参照側から書換えられる」の解決策を考えてたら長くなりそうだったのでエントリーを分けました。

次のように考えました。
【対処法】
定数にスカラ以外を設定できるけど設定しちゃうと思わぬ不具合を引き起こすかもしれないので使わない方がいいかも。

代わりに定数のように扱える変数をつくってみたらどうだろう。

いくつかアイデアがあったのですが、”画期的!”と自画自賛した方法がうまく動かなかったので以前から使っている方法をご紹介してお茶を濁しておきます。

package  {
	import flash.utils.ByteArray;
 
	public class Fruits extends Object {
		private static var _BASKET:Array = null;
 
		public function Fruits() {
		}
 
		public static function set BASKET(datas:Array):void
		{
			if (_BASKET != null)
				return;
			_BASKET = clone(datas);
		}
 
		public static function get BASKET ():Array
		{
			return clone(_BASKET);
		}
 
		protected static function clone(source:*):*
		{
			var ba:ByteArray = new ByteArray();
			ba.writeObject(source);
			ba.position = 0;
			return ba.readObject();
		}
	}
}

Class側の設定は以上です。

テスト

var datas:Array = ['apple','banana','melon'];
Fruits.BASKET = datas;
 
var copy:Array = Fruits.BASKET;
 
datas[0] = 'スイカ';
trace(Fruits.BASKET); //apple,banana,melon
trace(copy); //apple,banana,melon
 
copy[0] = 'マンゴ';
trace(Fruits.BASKET); //apple,banana,melon
trace(copy); //マンゴ,banana,melon
 
var datas2:Array = ['いか','たこ','さんま'];
 
Fruits.BASKET = datas2;
trace(Fruits.BASKET); //apple,banana,melon

引数で渡される配列が二次元以上だと concat, slice では複製が作れないので以前投稿したclone関数を使っています。

1件のコメント

  1. ピンバック: ActionScript 3, 配列を定数にしても参照側から書換えられる | イナヅマtvログ

コメントを残す