我正在研究" Java SE 7程序员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
}
哪行代码打破了封装?答案:第9行。&#34;当封装像ArrayList这样的可变对象时,你的getter必须返回对该对象副本的引用,而不仅仅是对原始对象的引用&#34;。
我没有理解解释或如何修改原始代码。
所以在getList()而不是
return list;
我们应该这样做吗?
ArrayList<Integer> list2=list;
return list2;
答案 0 :(得分:9)
你会替换:
return list;
使用:
return new ArrayList<Integer>(list);
否则客户可以做...
foo.getList().add(5);
打破封装。
答案 1 :(得分:2)
we do this?
ArrayList<Integer> list2=list;
return list2;
不,它说的是对象的副本,而不是引用的副本。
ArrayList<Integer> list2= new ArrayList<>();
list2.addAll( list );
return list2;
或者如所指出的那样,ArrayList
有一个复制构造函数,它将来自另一个列表的所有元素添加到新列表中。以上三行主要是为了明确正在做什么。
答案 2 :(得分:1)
您可以使用复制构造函数
return new ArrayList<Integer>(list);
答案 3 :(得分:0)
return list;
将返回对私有ArrayList列表的引用,这是封装中断的地方。
ArrayList<Integer> list2=list;
return list2;
即使在这里,您也只是将列表的引用传递给 list2 您可以尝试 -
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.addAll(list);