Почему является removeRange AbstractList Java () защищенным методом?

Делает у любого есть любая идея, почему removeRange метод в AbstractList (и также в ArrayList) protected? Это похоже на довольно четко определенную и полезную операцию, но тем не менее, для использования его мы вынуждены разделить Реализацию списка на подклассы.

Разве существует ли некоторое скрытое объяснение? Кажется довольно необъяснимым мне.

96
задан Joonas Pulakka 18 February 2010 в 14:15
поделиться

1 ответ

Да, потому что это не способ удаления диапазона из внешнего кода. Вместо этого сделайте следующее:

list.subList(start, end).clear();

Это фактически вызывает removeRange за кулисами.


OP спрашивает, почему removeRange не является частью общедоступного API List . Причина описана в правиле 40 Эффективной Java 2-е изд, и я цитирую ее здесь:

Есть три метода сокращения слишком длинных списков параметров. Один из них - разбить метод на несколько методов, каждый из которых требует только подмножества параметров. Если сделать это неаккуратно, это может привести к слишком большому количеству методов, но также может помочь уменьшить количество методов за счет увеличения ортогональности. Например, рассмотрим интерфейс java.util.List . Он не предоставляет методов для поиска первого или последнего индекса элемента в подсписке, оба из которых требуют трех параметров. Вместо этого он предоставляет метод subList , который принимает два параметра и возвращает представление подсписка.Этот метод можно комбинировать с методами indexOf или lastIndexOf , каждый из которых имеет единственный параметр, для получения желаемой функциональности. Более того, метод subList может быть объединен с любым методом , который работает с экземпляром List , для выполнения произвольных вычислений над подсписками. Полученный API имеет очень высокое соотношение мощности к весу.

Можно возразить, что removeRange не имеет такого количества параметров и поэтому, вероятно, не является кандидатом для этой обработки, но с учетом того, что есть способ вызвать removeRange через subList , нет причин загромождать интерфейс List избыточным методом.


В документации AbstractList.removeRange говорится:

Этот метод вызывается операцией clear для этого списка и его подсписок. Переопределение этого метода для использования внутренних возможностей реализации списка может существенно улучшить производительность операции clear для этого списка и его подсписок.

Также см. Реализацию OpenJDK AbstractList.clear и SubList.removeRange .

159
ответ дан 24 November 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: