Почему метод removeRange() AbstractList Java защищен?
есть ли у кого-нибудь идеи, почему метод removeRange в AbstractList (а также ArrayList) составляет protected? Это выглядит довольно хорошо определенными и полезная операция, но все-таки, чтобы использовать его, мы вынуждены подкласс реализации списка.
есть ли какое-то скрытое обоснование? Мне это кажется совершенно необъяснимым.
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.