Сплитератор getExactSizeIfKnown противоценкаSize - PullRequest
0 голосов
/ 01 июня 2018

Это возникло, когда я писал кастом Spliteratorзнаю Я должен переопределить estimateSize, если я знаю размер, даже приблизительный.И обычно я делаю.Но тогда есть getExactSizeIfKnown, и я понимаю, что это реализация по умолчанию:

default long getExactSizeIfKnown() {
    return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
}

Теперь, предположим, я работаю над ArrayListSpliterator (я понимаю, что он уже существует, но это не главное).Должен ли я переопределить getExactSizeIfKnown или estimateSize или может быть даже оба?

Внутренне, я думаю, getExactSizeIfKnown фактически вызывается, не estimateSize - так как первый делегируетвторой.Учитывая, что теоретически я работаю над ArrayListSpliterator, не будет переопределять getExactSizeIfKnown на самом деле просто заставит меня заплатить за один дополнительный вызов метода - объездной getExactSizeIfKnown -> estimateSize?

1 Ответ

0 голосов
/ 01 июня 2018

Ответ на вопрос «Должен ли я переопределить getExactSizeIfKnown или estimateSize или может быть даже и то и другое?» Заключается в том, что вы должны реализовать estimateSize в том виде, как оно abstract.Вы можете дополнительно переопределить метод default getExactSizeIfKnown, если видите причину.

Внутренне, я думаю, getExactSizeIfKnown фактически вызывается, не estimateSize - так какпервый делегирует второму.

Это не так просто.Будьте готовы к кодовому вызову getExactSizeIfKnown, поскольку он может использовать этот номер только в том случае, если он точен и не проверил характеристики.Но в то же время может быть другой код, вызывающий estimateSize, либо потому, что он хочет оценки, либо потому, что он будет обрабатывать характеристики в другом месте.Тот факт, что один имеет реализацию default, которая может делегировать другому при определенных условиях, ничего не говорит о вызывающей стороне.Эти методы имеют различную семантику.

Учитывая, что теоретически я работаю над ArrayListSpliterator, не переопределяет getExactSizeIfKnown фактически просто заставит меня заплатить за один дополнительный методвызов - объезд getExactSizeIfKnown -> estimateSize?

Вероятно, условное вредит больше, чем вызов делегирования, но если ваш конкретный Spliterator неизменно возвращаетС теми же характеристиками оптимизатор JVM, вероятно, устраняет любые накладные расходы, связанные с этим.Так что это обычный компромисс, здесь крошечный потенциальный выигрыш в производительности по сравнению с крошечным усилием по разработке (для предоставления дополнительного метода, просто возвращающего известное число).

Если вычисление размера не является тривиальным, вы быв любом случае в конечном итоге на делегирование, так как вы не хотите дублирования нетривиального кода.И если ваш класс разработан таким образом, что характеристика SIZED присутствует не всегда, вы все равно будете делать то же самое, что и метод default.

...