[英]Encapsulation for mutable objects in Java
我正在學習“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行。“當封裝像ArrayList這樣的可變對象時,你的getter必須返回對對象副本的引用,而不僅僅是對原始對象的引用”。
我沒有理解解釋或如何修改原始代碼。
所以在getList()而不是
return list;
我們應該這樣做嗎?
ArrayList<Integer> list2=list;
return list2;
你會替換:
return list;
有:
return new ArrayList<Integer>(list);
否則客戶可以做...
foo.getList().add(5);
打破封裝。
we do this?
ArrayList<Integer> list2=list;
return list2;
不,它說的是對象的副本,而不是引用的副本。
ArrayList<Integer> list2= new ArrayList<>();
list2.addAll( list );
return list2;
或者如所指出的, ArrayList
有一個復制構造函數,它將另一個列表中的所有元素添加到新列表中。 以上三行主要是為了明確正在做什么。
您可以使用復制構造函數
return new ArrayList<Integer>(list);
return list;
將返回對您的私有ArrayList列表的引用,這是封裝中斷的地方。
ArrayList<Integer> list2=list;
return list2;
即使在這里,你只是將列表的引用傳遞給list2你可以嘗試 -
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.addAll(list);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.