2016-03-26 23 views
0

Stringをパラメータとして受け入れ、汎用のオブジェクトに変換するユーティリティメソッドを実装しています。私は以下のコードで達成することができますが、弱点です。解析が必要なすべてのオブジェクトには、文字列コンストラクタが必要です。オブジェクトにStringコンストラクタが必要であることを定義する方法はありません。ポリモーフィズムまたはジェネリックを使用してこれを達成する他のよりよい方法はありますか?文字列をオブジェクトに変換する一般的な方法

AAA.java

public class AAA { 
    private String id; 
    private String description; 

    public AAA(String str) { 
     // Do parsing... 
    } 

ユーティリティメソッド。

public static <T extends Base> List<T> readFile(File file, Class<T> type) { 
    List<T> collection = new ArrayList<T>(); 
    // Read file line by line and convert to Instance 

    Constructor<T> ctor = type.getConstructor(String.class); 
    T newInstance = ctor.newInstance(line); 
    if (newInstance != null) { 
     collection.add(newInstance); 
    } 
    return collection; 
} 

使用法:

List<AAA> list = FileUtil.readFile(file, AAA.class); 
+0

あなたの文字列はどのような形式ですか?またはあなたのファイル。それはCSVカンマで区切られているのか、それともJSONなのでしょうか? –

+0

あなたは文字列のフォーマットを決めるのですか? –

+0

@DanielvanHeerdenそれはCSVです。 – swemon

答えて

0

私はあなたのPOJOクラス(実際にデータが含まれている1)が、あなたの例を持っている形式で通常であることを前提としています。すべてのフィールドがStringの値であることを意味します。これが当てはまらない場合は、私のソリューションは少し洗練が必要です。

私が提案するのは、あなたが記述したユースケースに対してリフレクションを使用することです。私は過去にこれで大成功を収めてきました。ひどく適用されると、反射は重大な性能上の不利益を被ります。

解析コードは、おおよそ次のようになります。あなたが提供しているものはすでに見栄えが良いので、メソッドのヘッダを省略します。私が提供するコードでは、String[]の変数lineには、あなたのCSVファイルの既に解析された行があります。配列の各要素には、CSV行の1列が含まれます。

String[] line; // initialised as explained above 
T newInstance = T.newInstance(); // invoke default constructor 
Field[] fields = newInstance.getClass().getDeclaredFields(); // use reflection to read all fields 
int count = 0; 
for(Fields f : fields) { 
    f.set(newInstance, line[count]); 
    count++; 
} 

免責事項:上記のコードでは境界チェックは行われません。 CSVラインとクラス内のフィールドの数は同じ長さであるという前提があります。

Field私が通常行うことは、フィールドに特定の注釈が設定されているかどうかを確認するためにgetAnnotationと呼ぶことです。これは、あなたがそのようなクラスを記述することができます:

public class AAAAnnotated { 

    @MyCSVAnnotation 
    String field1; 

    @MyCSVAnnotation 
    String field2; 

    String field3; 
} 

もしフィールドがあなたも手つかずのままにするフォームCSVをロードするためのフィールドとPOJOクラスで制御することができ、あなたのアノテーションで注釈を付けているかどうかをあなたのコードをチェックします。

関連する問題