0

我有一个 Java 问题,但更多的是面向对象相关的。

public class A {

    private List list;

    public A() {
        this.list = new ArrayList();
    }

    public List getList() {
        return this.list;
    }

    public void setList(List new_list) {
        this.list = new_list;
    }
}

public class Main {

    public static void main(String args[]) {
        A a = new A();
        List my_list = new ArrayList();
        a.setList(my_list);
        my_list.add("bla");
    }
}

问题:是否允许调用者(本例中为 main())假设 setList(...) 保存了对 List 对象的引用?

具体来说 - main() 方法中的最后一行代码 - 将“bla”添加到 my_list 并假设它也将添加到 A 对象的 List 中。

提前致谢。

4

3 回答 3

0

在您的代码中,调用者(main方法)引用了与 class 相同的列表A

我认为有两种选择:

  • setter 方法只是保存引用(如您的代码中所示)
  • setter 方法进行预防性复制

我在开发人员生活中看到的常用方法是保存引用。如果你想做一个预防性的副本,我认为应该在 javadoc 中。还有一些人总是返回列表的不可变版本以防止修改对象的状态。选择更多的是关于你在这里做什么。如果不信任代码的调用者,请进行预防性复制。

于 2013-06-30T11:20:22.287 回答
0

答案是肯定的。Java 中的每个赋值都默认使用对象引用,除了像int.

于 2013-06-30T11:13:00.620 回答
0

您正在处理引用,而不是真实对象。因此,当你打电话

List my_list = new ArrayList();
a.setList(my_list);

对my_list的引用存储在a.list中。因此,您的代码my_lista.list中有两个对同一List对象的引用。现在,当你打电话

my_list.add("bla");

“bla”被添加到List对象中,该对象也被a.list 引用。如果您将上述调用替换为

a.getList().add("bla");

你会得到同样的结果。

于 2013-06-30T11:15:28.667 回答