背景設定
Android で Web サービス データにアクセスしてキャッシュするためのライブラリを作成しようとしていますが、問題が発生しました。
ライブラリによって管理されるすべてのオブジェクトは、基本Entity
クラスから継承されます。の任意の派生クラスは、他のフィールドまたは属性Entity
を *宣言できます。
Entity
基本クラスは、キャッシュ (SQLite またはファイル) または Web サービス (REST または SOAP) から読み取られる属性を返す役割を担います。私の現在の実装では、クラスはリフレクションを使用してこれを実行します。注釈Entity
でマークされたすべてのクラス フィールド名を読み取ります。@Attribute
問題
私の実装で抱えている問題は次のとおりです。Entity
のような関数を使用してすべての の属性を要求するたびstatic Set<String> getAttributes()
に、この関数は実装を作成する必要がありますSet
(現在HashSet
、高速ルックアップのために使用しています)。
Set<String>
すべての属性のリクエストが行われるたびに を割り当てて初期化することは避けたいと思います。
私の見解では、属性セットはオブジェクトEntity
ではなく、クラス全体に固有のものです。Entity
つまりclass Customer extends Entity
、すべてのCustomer
インスタンスがまったく同じ属性を持ち、それぞれに名前、アドレスなどがあります。
これに対する私の現在の試みは、次のように、クラスのブロックでリフレクションを使用しstatic Set<String> attributes
て拡張Entity
および初期化するすべてのクラスでa を宣言することです。Set
static
class Customer extends Entity
{
private static final Set<String> attributes = new HashSet<String>();
static
{
Entity.populateAttributes(Customer.class);
}
}
初期化するクラスが与えられると、クラスはそのクラスとその基底クラスの注釈でEntity
マークされたすべてのフィールドを検索できます(たとえば、クラスに対して宣言された属性とクラスから継承された属性でセットを埋めます)。@Attribute
Customer extends Person
Person extends Entity
Customer.attributes
Customer
Person
私が抱えている問題は、attributes
拡張するクラスに対してセットが定義されていない可能性がありEntity
、コンパイル時にそれを強制したいということです。
Serializable
Eclipse のインターフェースでこれが行われているのを見てきました。 を実装するクラスを作成すると、クラスSerializable
が[private] static final long serialVersionUID
.
質問
クラスがフィールドを宣言していない場合、クラスにそのSerializable
動作を強制し、警告または (より良い) エラーを表示する方法はありますか?Entity
Entity
派生クラスの属性名を返す別の方法はありますか?
脚注
*ライブラリによって管理されるべきではないオブジェクト プロパティの用語と、ライブラリによって管理されるべきオブジェクト プロパティ (Web サービスまたは SQLite/ファイル キャッシュから読み取られ、Web サービスまたは SQLite で永続化される)の用語を使用しました。 /ファイルキャッシュ)field
attribute
編集1
基本的に、私が達成しようとしているのは、一連のEntity
の属性* (上記の脚注を参照) を効率的な方法で取得することです。このリストは、ヘルパー クラスがオブジェクト値をデータベースに格納する (CREATE TABLE
クエリは属性名と型から推測できます) か、Web サービスに送信するために使用されます。
このライブラリは、Web サービスから値をキャッシュし、ローカル データベース (追加のユーザー入力値が含まれている可能性があり、オブジェクトのサーバー更新値が欠落している可能性があります) を Web サービス経由でアクセス可能なデータと同期するために使用されます。アプリケーションでのフィールドごとのアクセサー/ミューテーターの使用を汎用アクセサー/ミューテーターに置き換えることは意図されていません。
この概念はキー値コーディングとして知られており、多くのフレームワークやライブラリで使用されています。例として、Google 検索で見つけた KVC を使用するライブラリの最初の 2 つの例は、Cocoa と Sproutcore です。参考文献: Apple 開発者ドキュメントおよびSproutcore wiki。
KVC は Android 開発でも使用されます。Bundle
、KVC を多用しますSQLiteCursor
。ContentValues