前に昼ご飯を食べながら話題になったAS3のDictionaryクラス。
自分なりに理解した過程。
akihiro kamijo: Dictionary クラス
オブジェクトをキーとして値を管理することができます。Object を使っても同じように連想配列を実現できますが、Dictionary ではいわゆる”弱い参照”が使えます。
また、Object では文字列がキーとして扱われるため toString() の値が同じオブジェクトは全て同じキーとして扱われますが、Dictionary では別々のオブジェクトであれば toString() の値に関わらず異なるキーとして扱われます。
「弱い参照」というのも一つのキーワード
弱い参照の使用
弱い参照とは、たとえ参照があってもガーベッジコレクションの対象となる種類の参照です。キャッシュなど”とりあえず置いておく”タイプのオブジェクトを管理するときなどに便利です。
Dictionary クラスは弱い参照を利用した weak-key と呼ばれるタイプのディクショナリーとして使うことができます。weak-key ディクショナリーでは、キーとして使われているオブジェクトへの参照が弱い参照になっています。そのため、キーオブジェクトへの参照が Dictionary からのみだと、ガーベッジコレクションのタイミングでキーオブジェクトが削除され、併せて Dictionary 内の該当するエントリが削除されます。
Dictionary クラスを weak-key ディクショナリーとして使うには、コンストラクタの引数に true を指定します。デフォルトは false になっています。
自分のことばで解釈。
連想配列を扱うとき、そのキーとなるオブジェクトへの参照の強さが
Object では強い(弱くない?)参照、Dictionary では弱い参照になる。
キーとなっているオブジェクトへの参照が他に存在しない時(弱い参照だけの時)、
そのオブジェクトはガーベッジコレクションのタイミングで削除される。
その時、同時にDictionary内の要素も削除される。
有効な使いどころを考えながら生活してみます。
– 参考サイト
akihiro kamijo: Dictionary クラス
akihiro kamijo: Dictionary クラス(前の続き)
Dictionary – ActionScript 3.0 コンポーネントリファレンスガイド