Hat jemand eine Ahnung, warum removeRange-Methode in Zusammenfassungsliste (und auch im Anordnungsliste) ist protected
? Es sieht nach einer ziemlich gut definierten und nützlichen Operation aus, aber um sie zu verwenden, müssen wir die List-Implementierung ableiten.
Gibt es eine versteckte Begründung? Scheint mir ziemlich unerklärlich.
Ja, weil Sie auf diese Weise keinen Bereich aus externem Code entfernen. Gehen Sie stattdessen folgendermaßen vor:
list.subList(start, end).clear();
Das ruft tatsächlich an removeRange
hinter den Kulissen.†
Der OP fragt warum removeRange
ist nicht Teil der List
öffentliche API. Der Grund ist in Punkt 40 von Effective Java 2nd ed beschrieben, und ich zitiere ihn hier:
Es gibt drei Techniken, um zu lange Parameterlisten zu kürzen. Eine besteht darin, die Methode in mehrere Methoden aufzuteilen, von denen jede nur eine Teilmenge der Parameter erfordert. Unvorsichtig gemacht, kann dies zu zu vielen Methoden führen, aber es kann auch helfen reduzieren die Methodenanzahl durch Erhöhen der Orthogonalität. Betrachten Sie zum Beispiel die java.util.List
Schnittstelle. Es bietet keine Methoden, um den ersten oder letzten Index eines Elements in einer Unterliste zu finden, die beide drei Parameter erfordern würden. Stattdessen bietet es die subList
Methode, die zwei Parameter akzeptiert und a zurückgibt Aussicht einer Unterliste. Diese Methode kann mit der kombiniert werden indexOf
oder lastIndexOf
Methoden, von denen jede einen einzigen Parameter hat, um die gewünschte Funktionalität zu erzielen. Außerdem die subList
Methode kombinierbar irgendein Methode, die auf a arbeitet List
Instanz, um beliebige Berechnungen für Unterlisten durchzuführen. Der resultierende API hat ein sehr hohes Leistungsgewicht.
Darüber kann man streiten removeRange
hat nicht so viele Parameter und ist daher wahrscheinlich kein Kandidat für diese Behandlung, aber da es eine Möglichkeit zum Aufrufen gibt removeRange
durch die subList
es gibt keinen Grund, die zu überladen List
Schnittstelle mit einem redundanten Verfahren.
† Das AbstractList.removeRange
Dokumentation sagt:
Diese Methode wird von aufgerufen clear
Operation auf dieser Liste und ihren Unterlisten. Überschreiben dieser Methode, um die Interna der Listenimplementierung nutzen zu können im Wesentlichen verbessern Sie die Leistung der clear
Operation auf dieser Liste und ihren Unterlisten.
Siehe auch OpenJDKs Implementierung von AbstractList.clear
und SubList.removeRange
.