我的一個類有一個包含Set的字段。該字段只填充到構造函數中,然後由其他類讀取。本來我有這樣的事情:訪問Java中的私人收藏字段
public class Foo {
public final Set<String> myItems;
public Foo(Collection<String> theirItems) {
this.myItems = new LinkedHashSet<String>(theirItems);
}
}
但是,這違背了面向對象的最佳實踐,通過myItems應該是私有的,而且只能通過getter和setter方法訪問。於是我把它改爲:
public class Foo {
private final Set<String> myItems;
public Foo(Collection<String> theirItems) {
this.myItems = new LinkedHashSet<String>(theirItems);
}
public Set<String> getItems() {
return myItems;
}
}
現在myItems是私有的,但誰調用getItems()仍然可以添加/隨意刪除項目,這在本質上是相同的情況下,我收到了。 (我不是真正關心別人改變項目內容,這更是一個理論性的問題)
於是我改變了getItems()返回一個數組:
public String[] getItems() {
return myItems.toArray(new String[myItems.size()]);
}
現在我的項目是真正的私有。不幸的是,我知道讀取這些項目的對象實際上想要使用一個Set,所以它將不得不將這個數組轉換回來。我還可以返回myItems的副本:
public Set<String> getItems() {
return new LinkedHashSet<String>(myItems);
}
這給了他們想要的來電,但在創建每個接入一套新的。
你在這樣的情況下做什麼 - 不惜一切代價保護隱私,接受原始結構的轉換/複製,或犧牲對集合內容的控制,並依靠負責任的呼叫者?
@tster:我只是在編輯「文檔吧!當你評論:) – 2009-10-01 05:32:38
哈哈,我剛剛刪除我的評論,因爲你評論。 – tster 2009-10-01 05:40:30