2011-07-18 93 views
4

將ArrayLists與EO(實體對象)轉換爲DTO對象的ArrayLists或Ids的ArrayLists的最有效方法是什麼?請記住,每個EO可能包含也是EO的屬性,或EO的集合,這些集合應在內部轉換爲DTO,或省略(取決於轉換策略)。一般來說,有很多樣板代碼。將集合從一種類型轉換爲另一種類型的策略

希望它是那麼簡單:

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 

當然,有人要也要保持映射策略,例如Factory或者某事物。

有什麼建議嗎?

回答

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); 
} 

你可以這樣使用,在一個通用的轉換方法:

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); 
         } 
        }); 

我用在我的一個開源項目中也採用了同樣的策略。例如,查看166行的JodeList。這在我的情況下有點簡化,因爲它只是從Jode轉換到任何類型,但它應該能夠擴展到任何類型之間的轉換。

相關問題