今天我处理的是一个让我困惑的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以这种方式行事。 谁能向我解释我做错了什么以及为什么会这样?
提前致谢!
答案 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();完全有效。