Warum ist die removeRange()-Methode von Javas AbstractList geschützt?

Lesezeit: 3 Minuten

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.

Benutzer-Avatar
CK Jung

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 subListes 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.

  • Ok, so kann man es machen, aber warum? Scheint umständlich. Einzelne Elemente können direkt aus der Liste entfernt werden, warum dann nicht mehrere Elemente?

    – Joonas Pulakka

    18. Februar 2010 um 14:22 Uhr

  • @Joonas: Punkt 40 von Effective Java, 2nd ed beschreibt die Begründung dafür. Ich füge den entsprechenden Abschnitt ein, falls Sie das Buch nicht haben.

    – C. K. Young

    18. Februar 2010 um 17:03 Uhr

  • +1 (Frage beantwortet). Aber nur weil eine Begründung gegeben wird, heißt das noch lange nicht, dass es Sinn macht. Der Prozess des Kürzens von Parameterlisten behindert die Fähigkeit von Entwicklern, die in einer API verfügbaren Operationen zu verstehen, was direkt dem Grund entgegenwirkt, warum die Listen überhaupt gekürzt wurden.

    – Sam Harwell

    21. September 2011 um 11:59 Uhr

  • Also typisch für Java. Machen wir es am kompliziertesten und am wenigsten effektiv.

    – Tomáš Zato – Wiedereinsetzung von Monica

    17. Juni 2013 um 21:21 Uhr

  • als Nebenbemerkung, ist dir das aufgefallen removeRange Anrufe arraycopy unnötig, wenn die ArrayList Version wird in einem Bereich verwendet, der bis zum Ende der Liste reicht? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/… das numMoved ist 0, also hätte der gesamte Arraycopy-Code in einen einzigen gesteckt werden können if (wie getan in remove); Der Unterschied besteht darin, dass a) arraycopy ein nativer Aufruf ist, der einen Overhead verursacht, b) arraycopy dies tut stets Parameter auf Korrektheit prüfen stackoverflow.com/questions/12594046/…

    Benutzer719662

    19. Februar 2016 um 14:30 Uhr

1312280cookie-checkWarum ist die removeRange()-Methode von Javas AbstractList geschützt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy