gpt4 book ai didi

java - 为什么 Spliterator 的 getExactSizeIfKnown() 不调用 hasCharacteristics()

转载 作者:行者123 更新时间:2023-12-02 04:13:54 25 4
gpt4 key购买 nike

Spliterator 类的源代码 (JDK 1.8.0_40) 中,getExactSizeIfKnown()default 实现会检查是否被操作的实例具有 SIZED 特征,直接调用 abstract features() 方法并检查它是否包含 SIZED,而不是仅仅调用hasCharacteristics(SIZED) 方法,它有一个 default 实现,它的作用几乎相同。

是否有任何原因导致 getExactSizeIfKnown() 未实现为:

return !hasCharacteristics(SIZED) ? -1L : estimateSize();

对我来说读起来更清晰,并且似乎可以更好地处理覆盖默认行为(目前,如果 hasCharacteristics(int) 被覆盖为奇怪的东西,则没有任何迹象表明getExactSizeIfKnown() 也许也应该被覆盖)?

我在这里缺少什么吗?为什么要在这样的方法之间重复检查?

最佳答案

这个问题显然是在 Spliterator 的设计过程中出现的。类(class)。在 this discussion 中引用 Paul Sandoz在 OpenJDK 邮件列表中:

Post by Mike Duigou
- getExactSizeIfKnown() - use hasCharacteristics?

我们可以,不这样做会更有效率。

看来没有什么强有力的理由,只是一个次要的性能考虑。

另一方面,我不认为你关于重写 hasCharacteristics(int) 的争论“一些奇怪的事情”确实成立。如果您要覆盖 hasCharacteristics(int) ,执行characteristics()还需要与“奇怪”的行为保持一致,否则你将违反 Spliterator 的契约(Contract)。请注意 getExactSizeIfKnown() 的实现规范(描述了符合实现的所需行为)说:

The default implementation returns the result of estimateSize() if the Spliterator reports a characteristic of SIZED, and -1 otherwise.

基于此,如果您覆盖 Spliterator 特征的行为,则会收到警告 getExactSizeIfKnown()默认情况下,将会受到影响。

关于java - 为什么 Spliterator 的 getExactSizeIfKnown() 不调用 hasCharacteristics(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33526235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com