【问题标题】:Declaring an Iterator before adding elements to a Collection在将元素添加到集合之前声明迭代器
【发布时间】:2017-08-17 13:55:17
【问题描述】:

如果您创建自己的 Iterable 容器类并在其元素上检索 java.util.Iterator,是否存在任何编码模式,根据该编码模式,容器中的任何进一步添加的元素应该可以访问来自Iterator?我在想“没办法,绝对不是,事实上Iterator 应该能够遍历所有元素,而不管添加如何。”

或者,如果在添加新内容后调用next(),快速失败的Iterator 是否应该抛出异常?

自从我用 Java 编码以来已经有一段时间了,但这里有些东西很臭。

【问题讨论】:

  • 第二个是真的。我相信如果你尝试使用 Java 的任何内置 Iterables 来做到这一点,你会得到一个 ConcurrentModificationException
  • 您绝对正确,我查阅了一些旧代码,这正是我应该做的。我希望你已经正式回答了这个问题,所以我可以接受它作为答案。我现在认为这个问题已经解决了。
  • 完成!乐于助人。

标签: java iterator fail-fast


【解决方案1】:

失败快速迭代器是否应该抛出一个 如果在添加新内容后调用 next() 会出现异常?

正确。我相信如果你尝试使用 Java 的任何内置 Iterables 来做到这一点,你会得到一个 ConcurrentModificationException

整个Javadoc for that exception 值得一读。它非常简洁。重点不是引用整个事情,而是不会快速失败的迭代器“[风险] 在未来不确定的时间出现任意的、非确定性的行为。

【讨论】:

    【解决方案2】:

    用户 Michael 在上面的评论中回答了我的问题。快速失败的迭代器应该做后者。现在,当人们应该更喜欢 Fail-fast 而不是 Fail-safe 时,我不确定,但鉴于容器在定义上是可变的,我相信 Fail-Fast 可能是唯一的出路。

    【讨论】:

    • 故障安全迭代器有其用途,但快速故障通常更可取。故障安全迭代器是可以的,前提是复制集合不是问题(对于大型数据集可能是这样),并且您不关心您拥有的数据是否是最新的。
    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多