为什么 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()
会受到影响。
在 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()
- usehasCharacteristics
?我们可以,但不这样做效率更高。
所以似乎没有充分的理由,只是一个次要的性能考虑。
另一方面,我认为您关于将 hasCharacteristics(int)
覆盖为 "something bizarre" 的论点并不成立。如果您要覆盖 hasCharacteristics(int)
,characteristics()
的实现也需要与 "bizarre" 行为一致,否则您将违反 Spliterator 的契约。请注意,getExactSizeIfKnown()
的实现规范(描述了符合要求的实现的行为)说:
The default implementation returns the result of
estimateSize()
if theSpliterator
reports a characteristic ofSIZED
, and -1 otherwise.
基于此,如果您覆盖 Spliterator 特性的行为,您会收到警告,默认情况下 getExactSizeIfKnown()
会受到影响。