如何在Java中将arraylist从一个类复制到另一个类?

时间:2010-02-05 01:53:46

标签: java arraylist deep-copy

据我所知,为了复制一个arraylist并且有两个彼此独立的列表,你必须使用一个深层副本(将对象从一个列表复制到另一个列表而不仅仅是引用),但有没有办法可以做到这一点跨类?

例如;我从Class1调用Class2。在Class2中,对象在事件发生时添加到自定义对象的ArrayList中。我希望能够将这个ArrayList转移到Class1,但每当我尝试时,我都会得到一个NullPointer。

任何线索??

2 个答案:

答案 0 :(得分:1)

这极大地表明了设计缺陷。

通过将列表包装在一个类中,共享该类并使用它来控制对列表的访问来查看是否无法实现相同的目标。

唯一不仅仅是直接工作的情况是你的两个班级必须独立修改名单。

如果这是一个要求,那么我可能会将一个不同的包装类实例交给每个修改类(引用相同的源列表),然后有一种方法可以用ID标记新添加的数据引用原始类 - 当您查询时,包装器将只返回未标记的项(属于原始共享列表的项)和使用它自己的ID标记的项。

要么包装类或包装类可以包含第二个列表,并且在查询时返回原始列表和第二个列表的组合结果。

我几乎从不想要一份深刻的副本。它发生了,但很少见。

如果你发布更多信息,也许我们可以更具体地帮助重新设计。

另外:(编辑) 有可能复制的数组列表不是你的问题 - 它可能不是TRULY的深层复制。对于深层复制,它意味着你实现了一个复制方法(我相信它们应该被称为.clone(),我从来没有使用过这个东西 - 就像我说的那样,这对于数组列表中的每个对象来说都是坏的)你可以在每一个上面调用你的复制方法,以便在你的下一个列表中获得新的副本。

此外,您复制的对象引用的任何对象也应该被克隆。 “深层”意味着一直到树下。

我猜你在这个过程的某个地方失败了。

我真的很想知道为什么你觉得你需要副本而不是参考。

答案 1 :(得分:0)

我的建议是你创建一个getArray()方法并从另一个类中调用它。这个方法应该创建一个ArrayList的副本,因为你不应该在类中“转移”变量;始终使用get()方法,因此OO范例保持不变。

做这样的事情:

第1类

public ArrayList<Object> getArray() {
   ArrayList<Object> aux = new ArrayList<Object>();
    for(Object x : list) //object is the string, int, etc...
        aux.add(x.clone()) //assuming the Object has a clone method!
    return aux;
   }

在Class 2上,只需调用此方法即可。然后从另一个关于null异常的答案看一下测试应该有效。 希望它有所帮助。