一个集合和它的迭代器之间存在循环依赖吗?

5
一个迭代器必须知道它要迭代的集合。那么集合是否也需要知道它的迭代器?依赖关系是单向的还是双向的?如果集合了解特定的迭代器实现,则可能无法为同一集合使用不同的迭代器策略。这是我的想法。我是对还是完全错了?
GoF书中有一个迭代器模式的图表,我认为它暗示了循环依赖关系。但是我不确定从List到ListIterator和从SkipList到SkipListIterator的虚线表示什么。
附注:我每天都在处理Java,但这可能更多是一个设计问题,而不是特定于某种语言的问题。

1
你有查看过Java集合的源代码以了解它们是如何实现的吗?这可能会对你的设计问题有所启发。 - Nate W.
1
有的,而且没问题。关键是迭代器接口抽象出了如何遍历集合的方法。迭代器实现处理这个问题。本质上,你可以将迭代器实现视为集合实现的一部分。重要的是接口之间没有这样的依赖关系。(也就是说,你不需要关心一个给定的Iterator作用于什么类型的集合,甚至它是否是一个集合。) - millimoose
@Geek 你可以假设有一个方法 List.reverseIterator(),它将再次返回一个 Iterator,只是一个能够反向遍历给定集合的实现。你也可以发明各种API来告诉集合你想要什么样的迭代器,然后可能得到它。但这不是API的设计方式。 - millimoose
1
@Geek 为了反驳你的例子:如果集合是一个具有无限元素的“惰性”集合呢?或者它代表从标准输入读取的行?这些都是你必须在更复杂的API中处理的情况。而且,由于你不能保证给定的“迭代策略”适用于任何给定的集合,这将会泄漏集合的许多实现细节到迭代器API中。 - millimoose
@Geek 记住,集合始终必须知道哪种迭代器实现是适当的。(例如,按索引获取项目,遵循链接列表,遍历树,在哈希中跳过空桶...)您所需的“迭代策略”(迭代器观察到的行为变化),以及Java的Iterator实现概念(如何实现此行为的内部细节)是完全不同的两个概念。 - millimoose
显示剩余4条评论
2个回答

3

对于大多数非特殊实现,集合不需要知道迭代器的存在。

在这种情况下,虚线表示实例化。如果您有《Gang of 4》一书,则可以在第15页1.6节中找到解释。

具体而言,迭代器是通过Java iterator()方法的CreateIterator方法创建的。

极客幽默:告诉别人你的“泽西海岸名字”是“THE INSTANTATION”。


那些专门的实现会是什么?你能举个例子吗? - Geek

1
不,它并非必然循环。这是因为你可以随时为给定的数据结构实现一个新的迭代器来表明这一点。
例如,如果你需要一个迭代器,它首先按升序生成ArrayList中偶数编号的元素,然后按降序生成奇数编号的元素,那么没有任何阻止你编写这个迭代器的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接