Да, потому что это не то, как вы удаляете диапазон из внешнего кода.Вместо этого сделайте следующее:
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
.