这是在我编写自定义< code>Spliterator时出现的。我知道我应该覆盖< code>estimateSize,如果我知道大小,即使是一个近似值。通常,我会的。但是还有< code>getExactSizeIfKnown并且我知道它的默认实现:
default long getExactSizeIfKnown() {
return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
}
现在,假设我正在处理一个ArrayListSpliterator
(我知道它已经存在,这不是重点)。我应该覆盖getExactSizeIfNotn
或估计大小
还是两者兼而有之?
在内部,我猜<code>getExactSizeIfKnown-因为第一个委托给第二个。考虑到理论上我正在使用ArrayListSpliterator
,覆盖getExactSizeIfKnown
实际上不会让我为一个额外的方法调用付费-绕道GetExactSizIfknow
-
“我应该覆盖getExactSizeIfKnown
还是masuriseSize
,或者甚至可能两者兼而有之?”的答案是,你必须实现massize,
因为它是抽象的
。如果您看到原因,还可以重写默认
方法 getExactSizeIfKnown
。
在内部,我猜getExactSizeIfNotn
实际上是被调用的,而不是估计大小
-因为第一个委托给第二个。
没那么简单。请为调用< code>getExactSizeIfKnown的代码做好准备,因为它可能仅在准确且未检查特征的情况下使用该数字。但同时可能有其他代码调用< code>estimateSize,因为它需要一个估计值,或者因为它将在另一个地方处理特征。事实上,一个调用方有一个< code>default实现,可以在特定条件下委托给另一个调用方,但这并不能说明调用方的任何情况。这些方法有不同的语义。
考虑到理论上我正在处理一个< code > arraylistspliterrator ,不会重写< code>getExactSizeIfKnown实际上只是让我为一个额外的方法调用——迂回< code > getExactSizeIfKnown —
条件调用的伤害可能比委派调用更大,但是如果您的特定拆分器
总是返回相同的特征,则 JVM 的优化器可能会消除与此相关的任何开销。因此,这是通常的权衡,在这里,与微小的开发工作相比,这是一个微小的潜在性能优势(用于提供仅返回已知数字的附加方法)。
如果大小的计算不是琐碎的,那么无论如何,您都会以委托结束,因为您不希望重复非平凡的代码。如果您的类设计为<code>大小的