Почему Java-метод AbstractRist removeRange () защищен? - PullRequest
94 голосов
/ 18 февраля 2010

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

Есть ли какое-то скрытое обоснование? Мне кажется совершенно необъяснимым.

1 Ответ

158 голосов
/ 18 февраля 2010

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

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

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


ОП спрашивает, почему removeRange не является частьюList публичного API.Причина описана в пункте 40 Effective Java 2nd ed, и я цитирую его здесь:

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

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


The AbstractList.removeRange документация гласит:

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

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

...