97 votes

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

Est-ce que quelqu'un a une idée, pourquoi méthode removeRange dans AbstractList (et aussi dans Liste de tableaux ) est protected ? Cela semble être une opération bien définie et utile, mais pourtant, pour l'utiliser, nous sommes obligés de sous-classer l'implémentation de la liste.

Y a-t-il une raison cachée ? Cela me semble tout à fait inexplicable.

160voto

Chris Jester-Young Points 102876

Oui, parce que ce n'est pas comme ça qu'on supprime une plage en dehors du code. A la place, faites ça :

list.subList(start, end).clear();

Cela appelle en fait removeRange dans les coulisses. †


Le PO demande pourquoi removeRange ne fait pas partie de la List l'API publique. La raison est décrite au point 40 de Effective Java 2nd ed, et je la cite ici :

Il existe trois techniques pour raccourcir les listes de paramètres trop longues. La première consiste à décomposer la méthode en plusieurs méthodes, chacune d'entre elles ne nécessitant qu'un sous-ensemble des paramètres. Si cela est fait sans précaution, cela peut conduire à un trop grand nombre de méthodes, mais cela peut également aider à réduire le site le nombre de méthodes en augmentant l'orthogonalité. Par exemple, considérez le java.util.List interface. Elle ne fournit pas de méthodes pour trouver le premier ou le dernier indice d'un élément dans une sous-liste, qui nécessiteraient toutes deux trois paramètres. Au lieu de cela, elle fournit la méthode subList qui prend deux paramètres et renvoie un voir d'une sous-liste. Cette méthode peut être combinée avec la méthode indexOf o lastIndexOf dont chacune possède un seul paramètre, pour obtenir la fonctionnalité souhaitée. De plus, les subList peut être combinée avec la méthode tout qui opère sur un List pour effectuer des calculs arbitraires sur des sous-listes. L'API qui en résulte présente un rapport puissance/poids très élevé.

On peut dire que removeRange n'a pas beaucoup de paramètres et n'est donc probablement pas un candidat pour ce traitement, mais étant donné qu'il y a une façon d'invoquer removeRange à travers le subList il n'y a aucune raison d'encombrer l'espace de travail de la Commission. List avec une méthode redondante.


† Le site AbstractList.removeRange de la documentation dit :

Cette méthode est appelée par le clear sur cette liste et ses sous-listes. En surchargeant cette méthode pour tirer parti des éléments internes de l'implémentation de la liste, on peut substantiellement améliorer les performances de l clear sur cette liste et ses sous-listes.

Voir également l'implémentation d'OpenJDK de la fonction AbstractList.clear y SubList.removeRange .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X