Quelqu'un at-il une idée, pourquoi la méthode removeRange dans AbstractList (et aussi dans ArrayList ) est protected
? Cela ressemble à une opération assez bien définie et utile, mais pour l'utiliser, nous sommes obligés de sous-classer l'implémentation List.
Y a-t-il une justification cachée? Cela me semble tout à fait inexplicable.
Oui, car ce n'est pas ainsi que vous supprimez une plage du code extérieur. Au lieu de cela, procédez comme suit:
list.subList(start, end).clear();
Cela appelle en fait removeRange
dans les coulisses.†
L'OP demande pourquoi removeRange
ne fait pas partie de l'API publique List
. La raison est décrite dans l'article 40 de Effective Java 2nd ed, et je le cite ici:
Il existe trois techniques pour raccourcir des listes de paramètres trop longues. L'une consiste à diviser la méthode en plusieurs méthodes, chacune d'entre elles ne nécessitant qu'un sous-ensemble de paramètres. Si cela est fait avec négligence, cela peut conduire à trop de méthodes, mais cela peut également aider à réduire le nombre de méthodes en augmentant l'orthogonalité. Par exemple, considérez le
Java.util.List
interface. Il ne fournit pas de méthodes pour trouver le premier ou le dernier index d'un élément dans une sous-liste, les deux nécessitant trois paramètres. Au lieu de cela, il fournit la méthodesubList
, qui prend deux paramètres et renvoie une vue d'une sous-liste. Cette méthode peut être combinée avec les méthodesindexOf
oulastIndexOf
, chacune ayant un seul paramètre, pour produire la fonctionnalité souhaitée. De plus, la méthodesubList
peut être combinée avec toute méthode qui opère sur une instanceList
pour effectuer des calculs arbitraires sur sous-listes. L'API résultante a un rapport puissance/poids très élevé.
On peut affirmer que removeRange
n'a pas autant de paramètres et n'est donc probablement pas un candidat pour ce traitement, mais étant donné qu'il existe un moyen d'invoquer removeRange
par le biais de subList
, il n'y a aucune raison d'encombrer l'interface List
avec une méthode redondante.
† Le AbstractList.removeRange
la documentation dit:
Cette méthode est appelée par l'opération
clear
sur cette liste et ses sous-listes. Remplacer cette méthode pour tirer parti des éléments internes de l'implémentation de la liste peut considérablement améliorer les performances de l'opérationclear
sur cette liste et son sous-listes.
Voir également l'implémentation OpenJDK de AbstractList.clear
et SubList.removeRange
.