私が使用してカスタムAPIを書いてReflection
、ファイルにオブジェクトを保存します。私は、次のクラス構造を持っています:
@Constructor
public XYZPOJO(@Key(key = "word") String word, @Key(key = "variations") ArrayList<String> varList) {
this.word = word;
this.varList = varList;
}
String word;
ArrayList<String> varList = new ArrayList<String>();
@Key(key = "word")
public String getWord() {
return word;
}
@Key(key = "variations")
public ArrayList<String> getVarList() {
return varList;
}
ファイルにオブジェクトを保存するとき、私のプログラムは、と注釈を付け、各メソッドを取得し@Key
、メソッドを呼び出し、値を使用してファイルに呼び出された値を保存し@Key
、プロパティ名として。私は、オブジェクトのインスタンスを作成したい場合、後でそれがで注釈が付けコンストラクタを検索する@Constructor
と、その後の値が取得@Key
コンストラクタの各パラメータのを、ファイルからキー(プロパティ)の値を取得します。
私の主な問題は、私が持続するすべてのフィールドのために私が複製する必要があるということです@Key
各メソッドの前にし、コンストラクタで対応するパラメータの前に注釈(および値)。両方のコンストラクタ/メソッドアノテーションは完全に一致しない場合はさらに、それがインスタンス化オブジェクトに失敗します。それは間違った値をコピーすることは非常に簡単です。
それぞれを定義する方法がある@Key
一度だけでは?
私は追加することを考えていた@Key
私は(私が間違っている場合は、私を修正してください)私は、もはやコンストラクタ経由でインスタンス化クラス(私は直接によってインスタンス化クラスに必要があるだろうと信じてのことができるようになることが、私は信じて存続したい各フィールドの前に一度だけ正しい、それによってコンストラクタを回避、リフレクションを介して各フィールドの値を設定?)。クラスがインスタンス化される前に、コンストラクタは、特定の必要な機能を実行するので、これは理想的ではありません。
他の解決策(複数可)は何がありますか?
ありがとう!
あなたがシリアライズごとに他のライブラリのようなことを行うことができますので、可能な解決策(あるいは単に、これらのライブラリのいずれかに切り替えるあなたが彼らのすべてのサポートのすべてのように):
デフォルトとちょうどゲッターの使用名(等によりスキップ注釈
getMoney
- >money
のみのコンストラクタで、使用する注釈)。そして、ゲッターに、あなたはシリアル化された形で、他の名前を使用する場合。さらに、あなたもそれに注釈をチェックするために同じ名前のフィールドを探すことができますが、それは必要なオプションではありません。コンストラクタ内の注釈パラメータのみが、名前とプロパティ名の両方を設定する(誰かが両方の値を提供しない限り、デフォルトでは、あなたがその名前==プロパティを取ることができる)以降、あなたがそのように、ゲッターメソッドの名前に変更することができます許可
money
- >getMoney
(ただ追加get
し、 )最初の文字の上部ケースを作ります第一のアイデアを適用するだけでなく、誰かが使用してコードをコンパイルする場合、ランタイムで使用可能なコンストラクタからパラメータ名を使用する
-parameters
フラグ。そして、あなたはシリアル化された形で別の名前を使用する場合を除き、そしてちょうどのみフィールド/ゲッターに注釈を追加し、任意の注釈を必要としません。
注:典型的なライブラリは、単にプロパティを見つけるためのパブリックメソッドをスキャン。始まるメソッドを探し、彼らはそうget
か、is
引数といくつかの戻り値の型を持っていない大文字に続いて、。典型的なデータクラスとしてはそのようになります。