为什么Spliterators.spliteratorUnknownSize()不后期绑定?

时间:2019-01-11 00:04:53

标签: java late-binding spliterator

我今天阅读了分隔符,并使用Spliterators.spliteratorUnknownSize(iterator(), Spliterator.NONNULL)实现了分隔符。根据{{​​1}}的文档

  

[结果]分隔符没有后期绑定

对分离器不熟悉,我想知道为什么会这样。如果我确保spliteratorUnknownSize()是后期绑定的,那么生成的分隔符也应该是,不是吗? iterator()只是创建一个spliteratorUnknownSize(),它尚未绑定到元素源。

也就是说,我很想了解为什么生成的分隔符没有后期绑定。谢谢。

1 个答案:

答案 0 :(得分:3)

根据javadocs

  

“未报告SpliteratorIMMUTABLE的{​​{1}}应当具有有关以下方面的书面政策:CONCURRENT绑定到元素源时;以及绑定后检测到的元素源的结构性干扰。后期绑定Spliterator会在第一次遍历,第一次拆分或首先查询估计大小时(而不是在{{ 1}}被创建,未进行后期绑定的Spliterator会在构造或首次调用任何方法时绑定到元素的源。当绑定{之前,对绑定源的修改会反映出来。遍历1}}。在绑定Spliterator之后,应尽最大努力,如果检测到结构干扰,则抛出Spliterator。...“

因此,如果您仔细分析一下, late-binding non-late-binding 确实是在开始检测结构性干扰时。

包裹{em>任意迭代器的Spliterator不能保证检测结构干扰。这取决于如何实现Spliterator。即使对于确实检测到(或减轻)结构干扰的ConcurrentModificationExceptionSpliterator也无法保证检测何时开始;即当“绑定”发生时。

简而言之,它不能保证真正的 late-binding 语义。


  

如果我确保Iterator是后期绑定,那么生成的Iterators也应该是,不是吗?

javadocs不保证这一点。

在实践中:尽管取决于Spliterator的实现,但可能应该如此。但是在javadocs中做出这样的声明可能会以有害的方式约束iterator()类及其嵌套类的 future 版本的实现。


您可能不同意我的分析。但是,javadocs的作者已经明确并蓄意地指出,这些Spliterator并不是最新的约束。如果您认为他们对此有误,请针对javadocs提出错误报告。