Javaのファイルシステムサブツリー上でイテレータを開発する必要があります。反復の進行中にファイルシステムの状態が変わる可能性があります(たとえば、新しいフォルダーやファイルが作成および削除されます)。したがって、イテレータは最初に階層のスナップショットをキャプチャし(たとえば、ツリーをクロールし、見つかったすべてのファイルの名前をリストに保存します)、次にスナップショットを反復処理する必要があります。
キャッシュを作成するコードをイテレータのコンストラクタに配置するのは良い考えかどうか疑問に思っています。別の方法は、そのための特別なメソッドを指定することです(名前付きinit
)。
繰り返されるサブツリーのサイズと深さは非常に大きくなる可能性があるため、キャッシュには時間がかかります。さらに、IOExceptionsがスローされる可能性があります(Javaのコンストラクターから例外をスローするのが適切な設計手法であるかどうかはまだわかりません)。
一方、イテレータを初期化するための専用メソッドを作成すると、クライアントコードはイテレータインターフェイスの単なる実装としてイテレータを使用できなくなります。
クライアントコードは、トラバーサルの前にinitメソッドを呼び出す役割も果たします。hasNext
/メソッドで最初にイテレータがnext
初期化されていることを確認し、初期化されていない場合は、init
その中からメソッドを呼び出すことができます。ただし、これは、これらのメソッドの最初の呼び出しが、クライアント側から見える理由がない限り、次のメソッドよりも大幅に遅くなることを意味します。