Java中可变对象的封装

Java中可变对象的封装,java,immutability,encapsulation,mutable,Java,Immutability,Encapsulation,Mutable,我当时正在学习“JavaSE7程序员I&II学习指南”,不理解下面的解释 class Fortress{ private String name; private ArrayList<Integer> list; Fortress() {list=new ArrayList<Integer>; String getName{return name;} void addToList(int x){list.add(x);} ArrayList g

我当时正在学习“JavaSE7程序员I&II学习指南”,不理解下面的解释

class Fortress{
  private String name;
  private ArrayList<Integer> list;

  Fortress() {list=new ArrayList<Integer>;

  String getName{return name;}
  void addToList(int x){list.add(x);}
  ArrayList getList(){return list;} // line 1
}
我们应该这样做吗

ArrayList<Integer> list2=list;
return list2;
ArrayList list2=列表;
返回列表2;

您可以使用复制构造函数

return new ArrayList<Integer>(list);
返回新的ArrayList(列表);

您必须替换:

return list;
与:

破坏封装。

我们这样做吗?
we do this?

ArrayList<Integer> list2=list;
return list2;
ArrayList list2=列表; 返回列表2;
不,它说的是对象的副本,不是引用的副本

ArrayList<Integer> list2= new ArrayList<>();
list2.addAll( list );
return list2;
ArrayList list2=新的ArrayList();
列表2.addAll(列表);
返回列表2;
或者正如所指出的,
ArrayList
有一个复制构造函数,它将把其他列表中的所有元素添加到新列表中。以上三行主要是为了明确正在做什么

return list;
将返回对您的私有ArrayList列表的引用这就是封装中断的地方

ArrayList<Integer> list2=list;
return list2;
ArrayList list2=列表;
返回列表2;
即使在这里,您也只是将列表的引用传递给列表2,您可以尝试-

ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.addAll(list);
ArrayList list2=新的ArrayList();
列表2.addAll(列表);
return list;
ArrayList<Integer> list2=list;
return list2;
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.addAll(list);