这是在我编写自定义 Spliterator
时出现的。我知道如果我知道尺寸,即使是近似尺寸,我应该覆盖estimateSize
。通常,我会这样做。但是还有 getExactSizeIfKnown
并且我了解它的默认实现:
default long getExactSizeIfKnown() {
return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
}
现在,假设我正在开发一个ArrayListSpliterator
(我知道它已经存在,但这不是重点)。我应该覆盖 getExactSizeIfKnown
或 estimateSize
还是两者都覆盖?
在内部,我猜实际上调用了 getExactSizeIfKnown
,不是 estimateSize
- 因为第一个委托(delegate)给了第二个。考虑到理论上我正在开发一个ArrayListSpliterator
,重写getExactSizeIfKnown
实际上不会让我为一个额外的方法调用付出代价 - 绕道getExactSizeIfKnown
-> estimateSize
?
最佳答案
“我应该覆盖 getExactSizeIfKnown
或 estimateSize
还是两者都覆盖?”的答案也就是说,您必须实现estimateSize
,因为它是抽象
。如果您发现原因,还可以重写default
方法getExactSizeIfKnown
。
Internally, I guess
getExactSizeIfKnown
is actually called, notestimateSize
- since the first one delegates to the second.
事情没那么简单。请为调用 getExactSizeIfKnown
的代码做好准备,因为只有在准确且未检查特征的情况下,它才可能使用该数字。但同时可能有其他代码调用 estimateSize
,因为它想要估计,或者因为它将在另一个地方处理特征。事实上,一个有一个默认实现,可以在某种条件下委托(delegate)给另一个实现,这一事实并不能说明调用者的任何情况。这些方法具有不同的语义。
Taking into consideration that theoretically I am working on a
ArrayListSpliterator
, will not overridinggetExactSizeIfKnown
actually just make me pay for one extra method call - the detourgetExactSizeIfKnown
->estimateSize
?
条件可能比委托(delegate)调用更有害,但如果您的特定 Spliterator
始终返回相同的特征,JVM 的优化器可能会消除与此相关的任何开销。因此,这是通常的权衡,在这里,与微小的开发工作相比,微小的潜在性能优势(提供仅返回已知数字的附加方法)。
如果大小的计算并不简单,那么无论如何您都会以委托(delegate)结束,因为您不希望重复重要的代码。如果您的类的设计方式并不总是存在 SIZED
特征,那么您无论如何都会执行与 default
方法完全相同的操作。
关于java - spliterator getExactSizeIfKnown 与estimateSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50641868/