Java中getter和list修改的组合

时间:2013-08-17 15:27:48

标签: java methods arraylist getter

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

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

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

当我向列表添加元素时,getter会被覆盖。这是因为someList在这种情况下就像吸气剂结果的参考一样吗?或者还有什么导致这种影响?

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

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以这种方式行事。 谁能向我解释我做错了什么以及为什么会这样?

提前致谢!

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

  

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

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

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

答案 2 :(得分:0)

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

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