簡體   English   中英

Java中可變對象的封裝

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM