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

dot*_*win 6 java late-binding spliterator

我今天读了一下spliterators并实现了一个使用Spliterators.spliteratorUnknownSize(iterator(), Spliterator.NONNULL).根据spliteratorUnknownSize()文件

[结果]分裂器不是后期绑定的

作为分裂者的新手,我想知道为什么会这样.如果我确保iterator()后期绑定,那么得到的分裂器也应该是,不是吗? spliteratorUnknownSize()仅仅创建一个IteratorSpliterator不与元素源绑定的东西.

也就是说,我很想理解为什么得到的分裂器没有后期绑定.谢谢.

Ste*_*n C 3

根据javadocs

Spliterator没有报告IMMUTABLECONCURRENT预计有关于以下内容的书面政策:何时Spliterator与元素源结合;以及在结合后检测到的元素源的结构干扰的检测。后期绑定Spliterator在该点与元素源结合第一次遍历、第一次分割或第一次查询估计大小的时间,而不是在创建时SpliteratorSpliterator非后期绑定的 A 在构造或第一次调用任何方法时绑定到元素的源。绑定之前的源在Spliterator遍历时会被反射。绑定后Spliterator,应尽最大努力,ConcurrentModificationException如果检测到结构干扰,则抛出。...”

因此,如果仔细分析的话,后期绑定非后期绑定实际上是关于结构干扰检测何时开始的。

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

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


如果我确保iterator()后期绑定,结果Spliterator也应该是,不是吗?

javadoc 不保证这一点。

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


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