需要从两个不同的表中加载项目列表(ArrayList)。由于复杂的Hibernate映射,它们无法作为一个ArrayList加载。所以它们在类定义中由两个不同的Hibernate包分别加载。当我使用它们时,我想组合成单个列表。所以我正在考虑编写如下函数,
private List<Item> combinedList = new ArrayList<Item>();
public List<Item> getCombinedList()
{
combinedList.clear();
combinedList.addAll(getList1());
combinedList.addAll(getList2());
return combinedList;
}
getCombinedList()将用于显示项目并用于其他只读操作。任何删除或修改或添加操作仍将在List1和List2中执行(因为它将由Hibernate处理)。
我的问题是如何在发生变化时有效地将getCombinedList()与源列表同步?
更新:每次调用getCombinedList()获取最新项目效率低下。我正在寻找一种方法来同步基础数据结构combinedList
。
答案 0 :(得分:3)
您必须编写自己的列表实现,该列表将使用两个列表进行初始化,并将所有方法执行委派给它们,以保护变异操作。
答案 1 :(得分:1)
您可以创建AbstractList的子类,该子类委派给两个单独的列表。
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());
}
}