【问题标题】:Why is Spliterators.spliteratorUnknownSize() not late-binding?为什么 Spliterators.spliteratorUnknownSize() 不是后期绑定?
【发布时间】:2019-06-05 21:54:31
【问题描述】:

我今天阅读了拆分器并使用Spliterators.spliteratorUnknownSize(iterator(), Spliterator.NONNULL) 实现了一个。根据spliteratorUnknownSize()的文档

[resulting] 拆分器不是后期绑定

作为分离器的新手,我想知道为什么会这样。如果我确保iterator() 是后期绑定的,那么生成的拆分器也应该是,不是吗? spliteratorUnknownSize() 只是创建了一个IteratorSpliterator,它还没有绑定到元素源。

也就是说,我很想了解为什么生成的拆分器不是后期绑定的。谢谢。

【问题讨论】:

    标签: java late-binding spliterator


    【解决方案1】:

    根据javadocs

    “未报告IMMUTABLECONCURRENTSpliterator 应有一个记录在案的策略:当Spliterator 绑定到元素源时;以及在之后检测到元素源的结构干扰绑定。后期绑定Spliterator 在第一次遍历、第一次拆分或第一次查询估计大小时绑定到元素源,而不是在创建Spliterator 时绑定到元素源。Spliterator 即非后期绑定在构造点或第一次调用任何方法时绑定到元素的源。在绑定之前对源所做的修改会在遍历Spliterator 时反映出来。绑定后Spliterator 应该在尽力而为,如果检测到结构干扰,则抛出ConcurrentModificationException。..."

    因此,如果您仔细分析,late-bindingnon-late-binding 实际上是关于何时检测结构干扰。

    包装了任意迭代器的Spliterator 不能保证检测到结构干扰。这取决于Iterator 的实现方式。即使对于检测(或减轻)结构干扰的IteratorsSpliterator 也无法保证检测何时开始;即当“绑定”发生时。

    简而言之,它不能保证真正的后期绑定语义。


    如果我确保 iterator() 是后期绑定的,那么生成的 Spliterator 也应该是,不是吗?

    javadocs 不保证这一点。

    在实践中:它可能应该是,尽管它取决于Spliterators 的实现。但是在 javadocs 中做出这样的声明可能会以有害的方式限制 Spliterators 类及其嵌套类的未来版本的实现。


    你可能不同意我的分析。然而,javadocs 的作者已经明确而有意地声明这些Spliterators 不是后期绑定的。如果您认为他们对此有误,请针对 javadocs 提出错误报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2010-12-27
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      相关资源
      最近更新 更多