【问题标题】:Combination of getter and list modification in JavaJava中getter和list修改的结合
【发布时间】:2013-08-19 20:48:15
【问题描述】:

今天我处理了一个让我非常困惑的 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 会这样。 谁能向我解释我做错了什么以及为什么会这样?

提前致谢!

【问题讨论】:

  • 因为在 Java 中,引用是按值传递的,obj.getListOfObjectsXY() 返回原始列表对象,该对象正在被您的add 方法修改。

标签: java methods arraylist getter


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-08
        • 1970-01-01
        • 2013-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-03
        相关资源
        最近更新 更多