2010-08-16 6 views
2

Il est nécessaire de charger une liste d'éléments (ArrayList) à partir de deux tables différentes. En raison du mappage Hibernate complexe, ils ne peuvent pas être chargés en tant que ArrayList. Ils sont donc chargés séparément par deux sacs Hibernate différents dans la définition de la classe. Quand je les utilise, j'aimerais les combiner en une seule liste. Donc, je pense à écrire une fonction comme suit,Synchronisation de plusieurs ArrayLists sources dans une seule liste cible

private List<Item> combinedList = new ArrayList<Item>(); 

public List<Item> getCombinedList() 
{ 
    combinedList.clear(); 
    combinedList.addAll(getList1()); 
    combinedList.addAll(getList2()); 
    return combinedList; 
} 

getCombinedList() sera utilisé pour afficher les articles et utilisés dans d'autres opérations en lecture seule. Toutes les opérations de suppression ou de modification ou d'ajout seront toujours exécutées dans List1 et List2 (car il sera géré par Hibernate).

Ma question est comment puis-je synchroniser efficacement getCombinedList() avec les listes de sources lorsqu'il y a un changement? Mise à jour: Appeler getCombinedList() à chaque fois pour obtenir les derniers éléments est inefficace. Je suis à la recherche d'un moyen de synchroniser la structure de données sous-jacente combinedList.

Répondre

3

Vous devrez écrire votre propre implémentation d'une liste qui sera initialisée avec les deux listes et déléguer toute l'exécution de la méthode aux deux en sécurisant les opérations de mutation.

1

Vous pouvez créer une sous-classe de AbstractList qui délègue aux deux listes séparées.

public class CombinedList<E> extends AbstractList<E> { 
    public CombinedList(List<E> list1, List<E> list2) { 
    this.list1 = list1; 
    this.list2 = list2; 
    } 
    List<E> list1; 
    List<E> list2; 
    public E get(int i) { 
    return (i < list1.size()) ? list1.get(i) : list2.get(i - list1.size()); 
    } 
    public boolean add(E e) { 
    return list2.add(e); 
    } 
    public E remove(int i) { 
    return (i < list1.size()) ? list1.remove(i) : list2.remove(i - list1.size()); 
    } 
} 
Questions connexes