web-dev-qa-db-fra.com

Pourquoi la méthode removeRange () de AbstractList de Java est-elle protégée?

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.

96
Joonas Pulakka

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éthode subList, qui prend deux paramètres et renvoie une vue d'une sous-liste. Cette méthode peut être combinée avec les méthodes indexOf ou lastIndexOf, chacune ayant un seul paramètre, pour produire la fonctionnalité souhaitée. De plus, la méthode subList peut être combinée avec toute méthode qui opère sur une instance List 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ération clear sur cette liste et son sous-listes.

Voir également l'implémentation OpenJDK de AbstractList.clear et SubList.removeRange .

159
Chris Jester-Young