《數據結構與抽象:Java語言描述(原書第4版)》一2.2.2 包的新實現
本節書摘來華章計算機《數據結構與抽象:Java語言描述(原書第4版)》一書中的第2章 ,第2.1節,[美]弗蘭克M.卡拉諾(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 羅得島大學 新英格蘭理工學院 辛運幃 饒一梅 譯 更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。
2.2.2 包的新實現
方法。可以修改ADT包的前一個實現,通過調整數組大小使包的容量僅由計算機可用的內存量來限定。如果看看程序清單2-1中ArrayBag類的框架,就明白需要修改什麼。下麵詳細說明這些任務:
- 將類名改為ResizableArrayBag,這樣就能區分這兩個實現。
- 從數組bag的聲明中刪除標識符final,以便可以調整它的大小。
- 修改構造方法的名字以匹配新的類名。
- 修改方法add的定義,讓它總能容納新項。該方法永遠不會返回假,因為包永遠不會滿。
修改方法add是上述任務中唯一的實質性工作。類的其他部分將保持不變。
方法add。下麵是方法add的定義,與2.1.4節中的一樣:
因為包永遠不會滿,所以add應該永遠返回真。為達到這個目的,當isArrayFull返回真時我們倍增數組的大小,而不是將result設置為假。在調整數組的大小時,將定義並調用另一個私有方法doubleCapacity,其規格說明如下:
假定我們已經定義了這個私有方法,則可以修改add方法,如下所示:
私有方法doubleCapacity。使用2.2.1節中描述的技術來調整數組bag的大小。因為我們增大包的容量,所以必須檢查新的容量不會超出MAX_CAPACITY。在構造方法中也做同樣的檢查,但不是重複這段代碼,而是定義讓構造方法和doubleCapacity都能調用的另一個私有方法來強製限製包的容量:
類ResizableArrayBag。新的類可從本書的在線網站上獲得。你應該研究這些類的細節。
設計決策:你可能不知道定義類ResizableArrayBag時我們的某些決策,比如會有下列問題:
- 為什麼方法add是一個布爾方法而不是一個void方法?它永遠返回真!
- 為什麼我們定義私有方法doubleCapacity?隻有add這一個方法調用它! 類實現了接口BagInterface,所以當定義add時我們遵從它的規格說明。結果有兩種不同的實現ArrayBag和ResizableArrayBag,同一位客戶可能都會用到。對第二個問題的回答,反映了我們解決問題的方法。為實現add,當數組滿時首先要調整數組的大小。不是在方法add內執行這個任務,而是選擇說明一個私有方法來擴展數組。不可否認,這個私有方法的定義很短。現在我們可以將私有方法的方法體集成到add中,但我們沒有緊迫的理由這樣做。另外,通過保留私有方法,我們堅持了一個方法應該執行一個動作的哲學理念。 > 自測題20 可以添加到類ResizableArrayBag中,用給定數組的內容來初始化包的構造方法是什麼? 自測題21 在前一個問題描述的構造方法的定義中,需要將參數數組中的項複製到數組bag中嗎?或者一條簡單的賦值語句(bag = contents)就足夠了? 自測題22 使用數組來組織數據的好處是什麼?壞處是什麼?
測試類。測試類ResizableArrayBag的程序可以創建一個包,它的初始容量很小——例如,3。這個選擇可讓我們簡單測試包增大其容量的能力。例如,當添加第4項時,包的容量要倍增到6。第7次添加時,容量再次倍增,這次是12。可以從本書的在線網站上獲得程序ResizableArrayBagDemo。
程序設計技巧:實現了聲明ADT操作的單一接口的類,應該將定義在接口中的方法聲明為公有方法。但是,類還可以定義私有方法和保護方法。
最後更新:2017-06-26 17:33:12