0

在该类的源码(JDK 1.8.0_40)中Spliteratordefault实现getExactSizeIfKnown()检查被操作的实例是否具有SIZED特性,直接调用abstract characteristics()方法并检查它是否包含SIZED,而不是只调用调用hasCharacteristics(SIZED)方法,它有一个default实现几乎相同的事情。

是否有任何理由getExactSizeIfKnown()不实施为:

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

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

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

4

1 回答 1

2

这个问题显然是在设计Spliterator课程时提出的。在 OpenJDK 邮件列表的讨论中引用 Paul Sandoz 的话:

麦克对狗发帖
——getExactSizeIfKnown()hasCharacteristics吗?

我们可以,不这样做会稍微有效一些。

因此,似乎没有强有力的理由,只有次要的性能考虑。

另一方面,我不认为你关于覆盖hasCharacteristics(int)“奇怪的东西”的论点真的成立。如果您要覆盖hasCharacteristics(int),则 的实现characteristics()也需要与那种“奇怪”的行为一致,否则您将违反 Spliterator 的合同。请注意,实现规范(描述符合实现的所需行为)getExactSizeIfKnown()说:

estimateSize()如果Spliterator报告的特征为,则默认实现返回结果,否则返回SIZED-1。

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

于 2015-11-05T08:21:46.837 回答