封裝集合
2004 年 8 月 3 日
如果你學習物件導向設計,你很快就會學到封裝資料的重要性。最簡單的封裝形式是使用存取器(取得和設定方法)或屬性,如果你的程式語言支援的話。(有些甚至在類別內執行此操作 - SelfEncapsulation
雖然取得和設定慣例適用於單一值,但它不適用於多值欄位,也就是值集合的欄位。在這種情況下,你需要不同的存取器方案。重點是你不希望讓客戶端直接存取集合資料結構本身,因為如果你這樣做,它會允許客戶端在供應商無法介入的情況下變更供應商的資料。封裝的重點在於一個物件控制對其資料的存取。
若要修改集合欄位,你通常會看到特定方法來將元素新增到集合,或從集合中移除元素。因此,如果我們有一個包含員工集合的 Company 類別,我們可能會預期有 addEmployee
和 removeEmployee
方法。偶爾你可能會看到一個接收集合的 setEmployees
方法,但通常有新增和移除方法會比較容易。
通常最棘手的部分在於取得方面。你不想傳回用於儲存物件的實際集合,否則人們可以在不使用封裝新增和移除方法的情況下新增和移除項目。那麼你傳回什麼?最佳選項是對底層集合的唯讀檢視。Java 的集合函式庫透過其不可修改的集合包裝器讓這變得容易。另一個選項(如果可用)是無法更新底層集合的迭代器。
如果這兩個選項都不可用,通常的回應是傳回底層集合的副本。這樣一來,如果客戶端修改它,它不會對實際集合產生任何影響。複製集合會有一點時間開銷,但由於這只是一堆物件參考,因此幾乎不重要。