Adobe Flex 3 ヘルプ

データプロバイダと uid プロパティ

Flex データプロバイダコントロールは、一意の識別子(UID)を使用してデータアイテムを追跡します。Flex では、UID の作成と管理を自動的に行うことができます。ただし、IUID インターフェイスを実装して独自の uid プロパティを提供しなければならない場合や、独自の uid プロパティを提供することで処理効率が向上する場合があります。

Object クラスと Array クラスは動的なので、データオブジェクトのアイテムがこれらのクラスに属する場合、通常はデータオブジェクトに対して特別な処理を行う必要はありません。ただし、データオブジェクトのアイテムが独自に定義したカスタムクラスに属する場合は、IUID インターフェイスの実装を検討してください。

注意: Flex はオブジェクト(例えば ArrayCollection のアイテムなど)の UID を作成するとき、アイテムの mx_internal_uid プロパティとして UID を追加します。mx_internal_uid プロパティは、バインド可能プロパティを持たない動的なオブジェクトに対して作成されます。mx_internal_uid プロパティが作成されないようにするには、オブジェクトクラスで、少なくとも 1 つのプロパティに [Bindable] メタデータタグを付けるか、IUID インターフェイスを実装するか 、uid プロパティに値を設定します。

複数の異なるオブジェクトを同一と見なす必要がある場合は、IUID インターフェイスを実装して、複数のオブジェクトに同じ uid 値を割り当てることができるようにする必要があります。IUID インターフェイスを実装しなければならない場合の代表的な例としては、アプリケーションでページングコレクションを使用する場合があります。ページングコレクション内をカーソルが移動すると、サーバーからの特定のアイテムの取得とメモリからの解放が何度も行われます。アイテムがメモリに取り込まれるたびに、そのアイテムを表す新しいオブジェクトが作成されます。アイテムが等しいかどうかを比較する場合は、同じアイテムを表すすべてのオブジェクトが Flex によって「同じもの」と見なされる必要があります。

IUID インターフェイスを実装しなければならないケースより、そうすることで処理効率が向上するケースの方がよくあります。原則として、データプロバイダエレメントが動的クラスのメンバーである場合、IUID インターフェイスは実装しません。これらのクラスについては uid プロパティを自動的に作成できます。しかしそれでも非効率的な面があるため、処理効率が特に重視される場合は、IUID インターフェイスの実装を検討してください。

その他のケースでは、Flex はディクショナリメカニズムを使用して uid を管理しますが、これは独自の UID を提供する場合ほど効率的ではありません。

IUID インターフェイスには、クラスメンバーの一意の識別子を表す uid プロパティが 1 つ含まれているだけで、メソッドはありません。Flex には、疑似乱数生成器を使用して標準の GUID 形式に準拠した識別子を作成する UIDUtil クラスが用意されています。この識別子は、ユニバーサルに一意であることは保証されていませんが、作成したクラスの全メンバーの中では一意になります。UIDUtil クラスを使用するクラス、例えば姓、名、ID の各フィールドを持つ Person というクラスを実装するには、次のパターンを使用できます。

package {
    import mx.core.IUID;
    import mx.utils.UIDUtil;

    [Bindable]
    public class Person implements IUID {
        public var id:String;
        public var firstName:String;
        public var lastName:String;
        private var _uid:String;

        public function Person() {
            _uid = UIDUtil.createUID();
        }

        public function get uid():String {
            return _uid;
        }

        public function set uid(value:String):void {
            // Do nothing, the constructor created the uid.
        }
    }
}

オブジェクトに従業員 ID などの一意の識別フィールドが含まれている場合には、UIDUtil クラスを使用する必要はありません。uid プロパティの値はデータプロバイダの中だけでオブジェクトを一意に識別できればよいので、この場合は従業員 ID を uid プロパティとして使用できます。次の例ではこの方法を採っています。

package 
{
    import mx.core.IUID;

    [Bindable]
    public class Person implements IUID {
        public var employee_id:String;
        public var firstName:String;
        public var lastName:String; 

        public function get uid(): String {
            return employee_id;
        }

        public function set uid(value: String): void {
            employee_id=value;
        }
    }
} 

注意: オブジェクトのクローン作成では UID は管理されず、UID と関連付けられることもありません。したがって、内部 UID を持つ対象のクローンを作成する場合、その内部 UID を変更する必要があります。UID は、動的オブジェクトの場合のみ、mx_internal_uid に格納されます。IUID を実装するデータクラスのインスタンスは UID を uid プロパティに格納するので、クローンの作成後、このプロパティを変更する必要があります。

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート