0

Spliteratorクラスのソース (JDK 1.8.0_40)では、メソッドを呼び出すだけでなく、直接メソッドを呼び出して が含まれているかどうかを確認することにより、操作対象のインスタンスが特性を持っているかどうかを確認するためのdefault実装を確認します。ほとんど同じことを行う実装。getExactSizeIfKnown()SIZEDabstract characteristics()SIZEDhasCharacteristics(SIZED)default

getExactSizeIfKnown()次のように実装されていない理由はありますか:

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

これは私にとってより明確に読み取れ、デフォルトの動作のオーバーライドをより適切に処理しているようです(現在、hasCharacteristics(int)何か奇妙なものにオーバーライドされている場合、おそらくオーバーライドする必要があるという兆候はありませんgetExactSizeIfKnown())?

私がここに欠けているものはありますか?このようなメソッド間でチェックを複製するのはなぜですか?

4

1 に答える 1

2

この質問は、Spliteratorクラスの設計中に出てきたようです。OpenJDK メーリング リストのこのディスカッションでPaul Sandoz を引用します。

投稿者: Mike Duigou
-getExactSizeIfKnown()使用しhasCharacteristicsますか ?

できますが、しない方がわずかに効率的です。

したがって、明確な理由はなく、パフォーマンスに関するわずかな考慮事項があっただけのようです。

hasCharacteristics(int)別の注意として、 「何か奇妙なもの」にオーバーライドすることについてのあなたの議論は本当に成り立たないと思います。をオーバーライドする場合hasCharacteristics(int)、 の実装characteristics()もその「奇妙な」動作と一致する必要があります。そうしないと、Spliterator の契約を破ることになります。の実装仕様 (準拠する実装の必要な動作を説明する) にgetExactSizeIfKnown()は、次のように記載されていることに注意してください。

デフォルトの実装は、が の特性を報告するestimateSize()場合はの結果を返し、それ以外の場合は-1 を返します。SpliteratorSIZED

それに基づいて、Spliterator 特性の動作をオーバーライドするgetExactSizeIfKnown()と、デフォルトで影響を受けることが警告されています。

于 2015-11-05T08:21:46.837 に答える