前投稿での「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
関数を使っています。
ピンバック: ActionScript 3, 配列を定数にしても参照側から書換えられる | イナヅマtvログ