【问题标题】:Is there a circular dependency between an collection and its iterator?集合与其迭代器之间是否存在循环依赖关系?
【发布时间】:2013-03-12 19:05:07
【问题描述】:

iterator 肯定必须知道它必须迭代的 collectioncollection 是否也必须知道它的 iterator?依赖是一种方式还是两种方式?如果集合了解特定的迭代器实现,则可能不可能对同一个集合有不同的迭代器策略。这是我的想法。我是对的还是我完全错了?

GoF 书中有这个迭代器模式的图表

我认为这意味着循环依赖。我不确定从ListLisIteratorSkipListSkipListIterator 的虚线。

P.S:我每天都在处理 Java,但可能更多的是设计问题,而不是特定于特定语言。

【问题讨论】:

  • 您是否查看了 Java 集合的源代码以了解他们是如何做到的?这可能会为您的设计问题提供一些见解。
  • 在 C++ 中可以使用:std::vector::iterator 这让我假设 vector 有一个包含迭代器的命名空间。
  • 是的,有,没关系。关键是迭代器 interface 从如何迭代集合中抽象出来。迭代器 implementation 处理这个问题。本质上,您可以将迭代器实现视为集合实现的一部分。重要的是接口之间没有这种依赖关系。 (即你不需要关心什么样的集合,即使它是一个集合,一个给定的Iterator 也可以工作。)
  • @millimoose 这意味着我不能用另一个迭代器实现替换一个迭代器实现?
  • @Geek 反驳您的示例:如果集合是具有无限数量元素的“惰性”集合怎么办?或者如果它代表从标准输入读取的行?这些都是您必须在更复杂的 API 中处理的所有情况。并且看到您不能保证给定的“迭代策略”适用于任何给定的集合,这会将集合的大量实现细节泄漏到迭代器 API 中。

标签: java language-agnostic iterator design-patterns


【解决方案1】:

除了一些专门的实现之外,集合不需要知道迭代器。

本例中的虚线表示实例化。如果你有 4 本书的帮派,解释在第 15 页,第 1.6 节给出。

具体来说,迭代器是由 Java iterator() 中的 CreateIterator 方法创建的。

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

【讨论】:

  • 那些专门的实现是什么。你能举个例子吗?
【解决方案2】:

不,它不是必需的循环。您可以随时为给定的数据结构实现新的迭代器这一事实清楚地表明了这一点。

例如,如果您需要一个迭代器,它首先按升序产生 ArrayList 的偶数元素,然后按降序产生奇数元素,那么没有什么可以阻止您编写这些内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2021-12-21
    • 2010-11-20
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多