1

今天我处理了一个让我很困惑的Java问题。我有以下代码:

List<ObjectXY> someList = obj.getListOfObjectsXY(); // getter returns 2 elements
someList.add(new ObjectXY());

obj.getListOfObjectsXY(); // getter now returns 3 elements

当我将元素添加到列表时,getter 会被某种覆盖。这是因为someList在这种情况下,它就像对 getter 结果的引用?或者还有什么导致这种效果的?

我通过使用另一个列表解决了以下代码的问题:

List<ObjectXY> someList = obj.getListOfObjectsXY(); // result: 2 elements

List<ObjectXY> someOtherList = new ArrayList<ObjectXY>();
someOtherList.addAll(someList);
someOtherList.add(new ObjectXY());

obj.getListOfObjectsXY(); // result: 2 elements

但我仍然有些困惑,因为我没想到 Java 会这样。谁能向我解释我做错了什么以及为什么会这样?

提前致谢!

4

3 回答 3

4

返回的结果实际上只是对您在内部使用的同一对象的引用的副本。指望调用者不修改对象是容易出错的。

一种解决方案是返回对包含列表的不可修改列表的引用。见Collections.unmodifiableList()。getter 调用者将无法修改您的列表。

于 2013-08-17T15:40:09.773 回答
2

这是因为 someList 在这种情况下就像对 getter 结果的引用吗?

是的。您收到的列表只是对您拥有的相同原始列表的引用。对此变量所做的任何更改都将反映在原始列表中。

通过将列表的值添加到新列表中,您明确地构造了一个新对象,因此它们被分开了。

于 2013-08-17T15:31:04.120 回答
0

在您的情况下,obj.getListOfObjectsXY()每次都返回相同的对象,并且在 Java 中对象引用是按值传递的。因此,当您执行 a 时someList.add(new ObjectXY());,它实际上是在设置指向 的对象 someList 的属性obj.getListOfObjectsXY()

在后一种情况下,您只是将 someList 复制到 someOtherList。然后你又向同一个 someOtherList 添加了一个元素,但没有向 someList 添加一个元素。因此,您在 obj.getListOfObjectsXY(); 中获得了 2 个元素;是完全有效的。

于 2013-08-17T15:35:22.927 回答