Pourquoi méthode removeRange () de Java AbstractList protégé?
-
21-09-2019 - |
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.
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éthodesubList
, qui prend deux paramètres et renvoie une vue d'une sous-liste. Ce procédé peut être combiné avec des méthodes deindexOf
oulastIndexOf
, dont chacune a un seul paramètre, pour donner la fonctionnalité souhaitée. En outre, le procédé desubList
peut être combiné avec toute méthode qui fonctionne sur une instance deList
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 declear
sur cette liste et ses sous-listes.
En outre, voir la mise en œuvre de OpenJDK de AbstractList.clear
et SubList.removeRange
.