Почему метод removeRange() AbstractList Java защищен?


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

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

1 92

1 ответ:

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

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

это на самом деле называет removeRange за кулисами.


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

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

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


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

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

кроме того, см. реализацию OpenJDK AbstractList.clear и SubList.removeRange.