我今天阅读了分隔符,并使用Spliterators.spliteratorUnknownSize(iterator(), Spliterator.NONNULL)
实现了分隔符。根据{{1}}的文档
[结果]分隔符没有后期绑定
对分离器不熟悉,我想知道为什么会这样。如果我确保spliteratorUnknownSize()
是后期绑定的,那么生成的分隔符也应该是,不是吗? iterator()
只是创建一个spliteratorUnknownSize()
,它尚未绑定到元素源。
也就是说,我很想了解为什么生成的分隔符没有后期绑定。谢谢。
答案 0 :(得分:3)
根据javadocs:
“未报告
Spliterator
或IMMUTABLE
的{{1}}应当具有有关以下方面的书面政策:CONCURRENT
绑定到元素源时;以及绑定后检测到的元素源的结构性干扰。后期绑定Spliterator
会在第一次遍历,第一次拆分或首先查询估计大小时(而不是在{{ 1}}被创建,未进行后期绑定的Spliterator
会在构造或首次调用任何方法时绑定到元素的源。当绑定{之前,对绑定源的修改会反映出来。遍历1}}。在绑定Spliterator
之后,应尽最大努力,如果检测到结构干扰,则抛出Spliterator
。...“
因此,如果您仔细分析一下, late-binding 与 non-late-binding 确实是在开始检测结构性干扰时。
包裹{em>任意迭代器的Spliterator
不能保证检测结构干扰。这取决于如何实现Spliterator
。即使对于确实检测到(或减轻)结构干扰的ConcurrentModificationException
,Spliterator
也无法保证检测何时开始;即当“绑定”发生时。
简而言之,它不能保证真正的 late-binding 语义。
如果我确保
Iterator
是后期绑定,那么生成的Iterators
也应该是,不是吗?
javadocs不保证这一点。
在实践中:尽管取决于Spliterator
的实现,但可能应该如此。但是在javadocs中做出这样的声明可能会以有害的方式约束iterator()
类及其嵌套类的 future 版本的实现。
您可能不同意我的分析。但是,javadocs的作者已经明确并蓄意地指出,这些Spliterator
并不是最新的约束。如果您认为他们对此有误,请针对javadocs提出错误报告。