Ответ на вопрос «Должен ли я переопределить getExactSizeIfKnown
или estimateSize
или может быть даже и то и другое?» Заключается в том, что вы должны реализовать estimateSize
в том виде, как оно abstract
.Вы можете дополнительно переопределить метод default
getExactSizeIfKnown
, если видите причину.
Внутренне, я думаю, getExactSizeIfKnown
фактически вызывается, не estimateSize
- так какпервый делегирует второму.
Это не так просто.Будьте готовы к кодовому вызову getExactSizeIfKnown
, поскольку он может использовать этот номер только в том случае, если он точен и не проверил характеристики.Но в то же время может быть другой код, вызывающий estimateSize
, либо потому, что он хочет оценки, либо потому, что он будет обрабатывать характеристики в другом месте.Тот факт, что один имеет реализацию default
, которая может делегировать другому при определенных условиях, ничего не говорит о вызывающей стороне.Эти методы имеют различную семантику.
Учитывая, что теоретически я работаю над ArrayListSpliterator
, не переопределяет getExactSizeIfKnown
фактически просто заставит меня заплатить за один дополнительный методвызов - объезд getExactSizeIfKnown
-> estimateSize
?
Вероятно, условное вредит больше, чем вызов делегирования, но если ваш конкретный Spliterator
неизменно возвращаетС теми же характеристиками оптимизатор JVM, вероятно, устраняет любые накладные расходы, связанные с этим.Так что это обычный компромисс, здесь крошечный потенциальный выигрыш в производительности по сравнению с крошечным усилием по разработке (для предоставления дополнительного метода, просто возвращающего известное число).
Если вычисление размера не является тривиальным, вы быв любом случае в конечном итоге на делегирование, так как вы не хотите дублирования нетривиального кода.И если ваш класс разработан таким образом, что характеристика SIZED
присутствует не всегда, вы все равно будете делать то же самое, что и метод default
.