在Spliterator类的源(JDK Spliterator)中,getExactSizeIfKnown()的default实现通过直接调用abstract characteristics()方法和检查它是否包含SIZED来检查正在操作的实例是否具有SIZED特性,而不只是调用hasCharacteristics(SIZED)方法,后者有一个基本相同的default实现。
是否有任何理由不将getExactSizeIfKnown()实现为:
return !hasCharacteristics(SIZED) ? -1L : estimateSize();在我看来,哪一种方式读得更清楚,似乎更好地处理了默认行为(目前,如果hasCharacteristics(int)过度使用bizzare,那么没有迹象表明getExactSizeIfKnown()也应该被覆盖)?
这里有什么东西我遗漏了吗?为什么要重复这种方法之间的检查呢?
发布于 2015-11-05 08:21:46
这个问题显然是在Spliterator类的设计过程中提出的。在这一讨论中引用Paul在OpenJDK邮件列表中的话:
作者: Mike Duigou -
getExactSizeIfKnown()--使用hasCharacteristics我们可以,它的效率略高一些。
因此,似乎没有很强的理由,只是一个轻微的性能考虑。
另一方面,我认为你关于将hasCharacteristics(int)重写为“奇异的东西”的论点并不成立。如果要重写hasCharacteristics(int),那么characteristics()的实现也需要与这种“奇怪”行为保持一致,否则就会破坏Spliterator的契约。请注意,getExactSizeIfKnown()的实现规范(描述符合实现所需的行为)说:
默认实现返回
estimateSize()的结果,如果Spliterator报告SIZED的特性,则为-1。
基于此,如果您重写了Spliterator特性的行为,则已经警告您,默认情况下,getExactSizeIfKnown()将受到影响。
https://stackoverflow.com/questions/33526235
复制相似问题