0

我知道,为了复制一个数组列表并拥有两个相互独立的列表,您必须使用深层复制(将对象从一个列表复制到另一个列表,而不仅仅是引用),但是有没有办法可以跨类完成?

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

有什么线索吗??

4

2 回答 2

1

这高度表明存在设计缺陷。

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

如果您的两个班级必须独立修改列表,那么这不会完全起作用的唯一情况。

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

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

我几乎从不想要深拷贝。它会发生,但非常罕见。

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

另外:(编辑)复制的数组列表很可能不是您的问题——它可能不是真正的深层副本。对于深拷贝,这意味着您为数组列表中的每个对象实现一个复制方法(我相信它们应该被称为 .clone(),我从不使用这个东西 - 正如我所说,它是坏 juju),然后您在每个人上调用您的复制方法以在下一个列表中获取新副本。

此外,您复制的对象引用的任何对象也应该被克隆。“深”是指一路顺着树。

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

我真的很想听听你为什么觉得你需要一份副本而不是参考资料。

于 2010-02-05T02:31:05.587 回答
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 上,只需调用此方法。然后只需从其他答案中查看有关空异常的测试,应该可以。希望能帮助到你。

于 2010-02-05T01:59:46.710 回答