2012-12-14 35 views
0

的快照,我需要在Java中的文件系統子樹開發迭代器。迭代仍在進行中時,文件系統的狀態可能會發生變化(例如,新文件夾和文件被創建並刪除)。迭代器因此應該首先捕獲層次結構的快照(例如,爬取樹並將找到的所有文件的名稱保存到列表中),然後迭代快照。迭代器在文件系統樹

我想知道,如果它是一個好主意,還是不要把代碼來創建緩存到迭代器的構造函數。另一種方法是指定對於一個speciall方法(名爲init)。

的大小和迭代子樹的深度可能會相當大,因此緩存將是費時。此外,它可能會拋出IOExceptions(我仍然不確定在Java中如何從構造函數中拋出異常是一個很好的設計實踐)。

在另一方面,建立一個專門的方法來初始化迭代器將意味着客戶端代碼不能使用迭代器一樣簡單Iterator接口的實現。

客戶端代碼也將是負責調用之前遍歷init方法。我能有hasNext/next方法首先確保迭代器已初始化,如果沒有,從它們內部調用init方法。但是這意味着對這些方法的第一次調用將比沒有任何理由在客戶端可見的下一個方法慢得多。

+0

所以,你想你的迭代器有文件系統的快照,以便如果文件更改而迭代,這些變化不會反映在迭代?如在中,您想迭代快照並忽略當前迭代對文件系統的更改嗎? – palako

+0

@palako:的確如此。 –

+0

現在,我在想,也許另一個實體應負責創建快照,迭代器將只接受在它的構造函數中的快照。 –

回答

0

正如你在評論中所說的那樣,我會去分離兩類中的職責:一個用於獲取文件系統的快照(例如FileSystemSnapshot),另一個用於迭代它。根據您所需要的靈活性,您可以在迭代器的構造函數創建FileSystemSnapshot實例或把它作爲一個構造函數參數。要在第一個方向使客戶更靈活地配置迭代,如果你計劃有,比如可以是有價值的,採取文件系統快照不同的策略。單元測試也更好,因爲它很容易創建mocks or stubs。但是,您迫使客戶端了解遍歷細節(即在遍歷文件系統之前必須對其進行緩存)。使用第二種方法隱藏了客戶端這個實施細則,但是不太靈活,有點棘手測試(在這裏你可以定義一個createFileSystemSnapshot()方法,然後嘲笑這個方法來返回你的測試不同的實例)。您可能還想檢查dependency injection模式。

HTH

0

創建在構造函數中的高速緩存應該罰款。關於耗時的部分,你需要根據你將如何使用迭代器來決定。如果客戶端在緩存完成之前無法迭代,則無論是構造函數還是初始化方法都需要花費時間,這是同步阻止操作。

如果緩存已經完成,然後才能開始迭代,你可以啓動一個線程,做緩存,但你需要重寫hasNext(),以考慮到這一點,這將是要麼hasNext()或下一個()誰正在等待。