Почему метод 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
.