Spliterator类的源代码(JDK 1.8.0_40)中,defaultgetExactSizeIfKnown()实现通过直接调用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/

10-11 03:49