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

Why does Spliterator's getExactSizeIfKnown() NOT call hasCharacteristics()

Spliterator class 的源代码 (JDK 1.8.0_40) 中,getExactSizeIfKnown()default 实现检查到查看被操作的实例是否具有SIZED特征,直接调用abstract characteristics()方法并检查它是否包含SIZED,而不是只调用hasCharacteristics(SIZED)方法,这有一个 default 实现,它做几乎相同的事情。

有什么原因导致 getExactSizeIfKnown() 没有实现为:

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

对我来说读起来更清楚并且似乎可以更好地处理覆盖默认行为(目前,如果 hasCharacteristics(int) 被覆盖为一些奇怪的东西, 没有 指示 getExactSizeIfKnown() 也应该被覆盖)?

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

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

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

我们可以,但不这样做效率更高。

所以似乎没有充分的理由,只是一个次要的性能考虑。

另一方面,我认为您关于将 hasCharacteristics(int) 覆盖为 "something bizarre" 的论点并不成立。如果您要覆盖 hasCharacteristics(int)characteristics() 的实现也需要与 "bizarre" 行为一致,否则您将违反 Spliterator 的契约。请注意,getExactSizeIfKnown() 的实现规范(描述了符合要求的实现的行为)说:

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

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