Question

Est-ce que quelqu'un a une idée, pourquoi méthode removeRange dans AbstractList (et aussi dans ArrayList ) est protected? Il ressemble à une opération assez bien définie et utile, mais encore, pour l'utiliser, nous sommes obligés de sous-classe la mise en œuvre de la liste.

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

Était-ce utile?

La solution

Oui, parce que c'est pas comment vous supprimez une plage de code externe. Au lieu de cela, faites ceci:

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

appelle en fait removeRange dans les coulisses.


L'OP demande pourquoi removeRange ne fait pas partie de l'List API publique. La raison est décrite dans l'article 40 de Effective Java 2e édition, et je cite ici:

  

Il existe trois techniques pour raccourcir les listes de paramètres trop longs. La première consiste à rompre la méthode en place plusieurs méthodes, dont chacune nécessite seulement un sous-ensemble des paramètres. Si cela est fait avec négligence, cela peut conduire à un trop grand nombre de méthodes, mais il peut aussi aider à réduire le compte de la méthode en augmentant orthogonalité. Par exemple, considérons l'interface java.util.List. Il ne fournit pas de méthodes pour trouver le premier ou le dernier indice d'un élément dans une sous-liste, toutes deux, il faudrait trois paramètres. Au contraire, il fournit la méthode subList, qui prend deux paramètres et renvoie une vue d'une sous-liste. Ce procédé peut être combiné avec des méthodes de indexOf ou lastIndexOf, dont chacune a un seul paramètre, pour donner la fonctionnalité souhaitée. En outre, le procédé de subList peut être combiné avec toute méthode qui fonctionne sur une instance de List pour effectuer des calculs arbitraires sur des sous-listes. L'API résultant a un très haut rapport puissance-poids.

On peut faire valoir que removeRange n'a pas beaucoup de paramètres et est donc probablement pas un candidat pour ce traitement, mais étant donné qu'il ya un moyen d'invoquer removeRange par le subList, il n'y a aucune raison d'encombrer l'interface List avec un procédé redondant.


AbstractList.removeRange documentation dit:

  

Cette méthode est appelée par l'opération de clear sur cette liste et ses sous-listes. Redéfinissant cette méthode pour tirer profit des internes de la mise en œuvre de la liste peut pas améliorer la performance de l'opération de clear sur cette liste et ses sous-listes.

En outre, voir la mise en œuvre de OpenJDK de AbstractList.clear et SubList.removeRange .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top