在Spliterator
类的源代码(JDK 1.8.0_40)中,default
的getExactSizeIfKnown()
实现通过直接调用SIZED
方法并检查来检查被操作的实例是否具有abstract characteristics()
特性。如果它包含SIZED
,而不是仅调用hasCharacteristics(SIZED)
方法,该方法具有default
实现,该实现几乎具有相同的作用。
有什么理由不能将getExactSizeIfKnown()
实现为:
return !hasCharacteristics(SIZED) ? -1L : estimateSize();
这对我来说更清晰,似乎可以更好地覆盖默认行为(当前,如果
hasCharacteristics(int)
被重写为某种奇怪的东西,则没有迹象表明getExactSizeIfKnown()
也应该被覆盖)?我在这里想念什么吗?为什么要在这样的方法之间重复检查?
最佳答案
这个问题显然是在Spliterator
类的设计过程中提出的。在OpenJDK邮件列表的this discussion中引用Paul Sandoz:
发表者Mike Duigou
-getExactSizeIfKnown()
-使用hasCharacteristics
?
我们可以,这样做的效率略高。
因此,似乎没有充分的理由,只有很小的性能考虑。
另一方面,我不认为您关于将hasCharacteristics(int)
覆盖为“奇怪的事情”的论点确实成立。如果要覆盖hasCharacteristics(int)
,则characteristics()
的实现也需要与该“ bizarre”行为保持一致,否则您将违反Spliterator的合同。请注意,getExactSizeIfKnown()
的实现规范(描述了实现的必需行为)说:
如果estimateSize()
报告特征Spliterator
,则默认实现返回SIZED
的结果,否则返回-1。
基于此,如果您覆盖了Spliterator特性的行为,则会警告您getExactSizeIfKnown()
在默认情况下会受到影响。
关于java - 为什么Spliterator的getExactSizeIfKnown()不调用hasCharacteristics(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33526235/