【发布时间】:2012-12-02 08:56:17
【问题描述】:
我需要在 Java 中的文件系统子树上开发一个迭代器。当迭代仍在进行时,文件系统的状态可能会发生变化(例如,新文件夹和文件被创建和删除)。因此,迭代器应首先捕获层次结构的快照(例如,爬取树并将找到的所有文件的名称保存到列表中),然后遍历快照。
我想知道将创建缓存的代码放入迭代器的构造函数是否是个好主意。另一种方法是为此指定一个特殊方法(命名为init )。
迭代子树的大小和深度可能会变得非常大,因此缓存会很耗时。此外,它可能会抛出 IOExceptions(我仍然不确定从 Java 的构造函数中抛出异常是否是一种好的设计实践)。
另一方面,创建一个专用的方法来初始化迭代器意味着客户端代码不能将迭代器用作迭代器接口的简单实现。
客户端代码还将负责在遍历之前调用 init 方法。我可以让hasNext/next 方法首先确保迭代器已被初始化,如果没有,则从其中调用init 方法。但这意味着对这些方法的第一次调用将比下一次调用慢得多,而客户端没有任何可见的原因。
【问题讨论】:
-
所以您希望您的迭代器拥有文件系统的快照,这样如果文件在迭代时发生更改,这些更改不会反映在迭代中?例如,您想迭代快照并忽略当前迭代对文件系统的更改?
-
现在我正在考虑它,也许另一个实体应该负责创建快照,而迭代器只会在其构造函数中接受快照。
-
你的问题到底是什么?请注意,迭代器通常不是使用构造函数创建的,而是使用可迭代类上的方法创建的。你只需要让这个方法初始化迭代器。
-
这是有道理的。因此,我宁愿拥有一个 SnapshotFactory,而不是迭代器,它会在给定时间生成文件系统的可迭代快照(例如文件名的链接列表)。对吗?
-
是的,没错。要么急切地创建快照,要么在第一次在对象上调用
iterator()时懒惰地创建。此方法可能会引发异常。迭代器本身的 hasNext() 和 next() 方法不会抛出任何东西。
标签: java oop design-patterns iterator