2011-07-18 12 views
4

EO(Entity Object)を持つArrayListをDTOオブジェクトのArrayListまたはIdのArrayListに変換する最も効率的な方法は何ですか?すべてのEOは、内部的にDTOに変換されるEOまたはEOのコレクションであるプロパティから構成されてもよいし、省略されてもよい(コンバージョン戦略に応じて)ことを忘れないでください。一般的には、定型コードがたくさんあります。当然のコレクションをある型から別の型に変換するための戦略

collectionOfUsers.toArrayList<UserDTO>(); 

か...

collectionOfUsers.toArrayList<IEntity>(); 
// has only an id, therefore it will be converted 
// into a collection of objects, having only an id. 

、これは同様に素晴らしいことができます:もちろん

collectionOfUsers.toArrayList<Long>() 
// does the same thing, returns only a bunch of ids 

、誰かがすべき

は、それはのように簡単だったらいいのにファクトリやsthなどのマッピングストラテジも保持します。

提案がありますか?

答えて

0

Apache Commons BeanUitls.populate()の使用を検討してください。

これは、Beanのそれぞれの同等のプロパティに別のプロパティを設定します。

2

単純なインターフェイスを使用して変換をシミュレートすることができます。

interface DTOConvertor<X,Y> { 
    X toDTO(Y y); 
} 

public static List<X> convertToDTO(Collection<Y> ys, DTOConvertor<X,Y> c) { 
    List<X> r = new ArrayList<X>(x.size()); 
    for (Y y : ys) { 
     r.add(c.toDTO(y)); 
    } 
    return y; 
} 

これはちょうどmap機能を実装したライブラリと同じであることに注意してください。

効率性の面では、エンティティオブジェクトが(おそらく)データベースからフェッチされるため、問題にぶつかると思います。あなたはそれが何か違いを生み出したかどうかを探求したいと熱望しています。

2

あるタイプから別のタイプに変換するための一般的な方法を作成する必要があります。ここではそのためのシンプルなインターフェイスは、次のとおりです。

public interface XFormer<T,U> { 
    public T xform(U item); 
} 

あなたは、その後、一般的な変換方法でそれを使用します。

本の用途の1つは、のように見えるかもしれ
public static <T, U> List<T> xForm(List<U> original, XFormer<T, U> strategy) { 
    List<U> ret = new ArrayList<U>(original.size()); 
    for (U item: original) { 
     ret.add(strategy.xform(item)); 
    } 
    return ret; 
} 

私が使用
List<String> original; 
List<Long> xFormed = xForm(original, new XFormer<Long, String>() { 
         public Long xForm(String s) { 
          return Long.parseLong(s); 
         } 
        }); 

を私のオープンソースプロジェクトのこの同じ戦略。例については、JodeListを166行目でご覧ください。それはJodeから任意の型に変換するだけなので、私の場合はやや簡略化されていますが、任意の型間の変換に拡張できる必要があります。

関連する問題