我有一個對象,它將一些數據存儲在列表中。實現可能會稍後改變,我不想將內部實現公開給最終用戶。但是,用戶必須有能力修改和訪問這個數據集合。目前我有這樣的事情:使用列表或集合更好嗎?
public List<SomeDataType> getData() {
return this.data;
}
public void setData(List<SomeDataType> data) {
this.data = data;
}
這是否意味着我已允許內部實現細節泄漏?我應該這樣做嗎?
public Collection<SomeDataType> getData() {
return this.data;
}
public void setData(Collection<SomeDataType> data) {
this.data = new ArrayList<SomeDataType>(data);
}
有一點需要記住的是,如果你像這樣返回實際的集合或列表,你允許別人做他們想做的任何事情,包括刪除項目甚至清除整個事情。您最好返回一個不可變的包裝或列表副本。 – 2010-05-26 23:55:57
@PaulTomblin是真實的,但它對系統有點矯枉過正和人爲的開銷。不可修改的包裝器在處理由持久性中間件管理的對象時是有意義的,甚至在極少數情況下也是如此。 – comeGetSome 2013-05-10 22:06:03
@comeGetSome,這就是爲什麼我說「可能」而不是「必須」。這取決於用例 - 如果我爲他人使用API,我會返回一個副本或包裝。如果是爲了我自己或是爲了值得信任的同事,我會在javadoc中放入一個大的「不要修改這個價值」,然後放在那裏。 – 2013-05-11 15:21:44