Haben containsAll () und retainAll () in der Collection-Schnittstelle Adresse Mächtigkeit?
-
03-07-2019 - |
Frage
In Java, die containsAll und retainAll in der Klasse Abstract ausdrücklich, dass die Mächtigkeit angeben, nicht eingehalten wird, so in anderen Worten spielt es keine Rolle, wie viele Instanzen eines Wertes auf jeder Seite sind. Da alle Java-Sammlungen in der Standardbibliothek Abstract verlängern, wird angenommen, dass sie alle die gleiche Arbeit.
Allerdings sagt die Dokumentation dieser Methoden in der Collection-Schnittstelle nichts. Soll man von Abstract schließen, oder wurde diese als nicht spezifiziert absichtlich ein ermöglichen Sammlungen zu definieren, die anders funktionieren?
Zum Beispiel Bag in Apache-Sammlungen ausdrücklich, dass sie Respekt Mächtigkeit der Fall ist, und behauptet, dass sie den Vertrag von der Version von Sammlung verletzt (obwohl es nicht wirklich).
So, was ist die Semantik dieser Operationen in Sammlung, statt in Abstract?
Edit: Tho diejenigen, die sich fragen, warum ich würde interessieren, dann ist es, weil im Rahmen meiner Ph.D. Ich arbeite gezeigt, dass Entwickler nicht erwarten, die Konformität Verletzung in Apache, aber ich versuche zu verstehen, warum die Collection-Schnittstelle links war so eindeutig.
Lösung
Die javadocs für containsAll (in Collection) sagen:
Returns: true, wenn diese Sammlung enthält alle Elemente in der angegebene Sammlung
und für retainAll (in Collection):
Behält nur die Elemente in dieser Sammlung, die in dem enthaltenen angegebene Sammlung (optional Betrieb). Mit anderen Worten, entfernt aus dieser Sammlung aller seiner Elemente, die in die nicht enthalten sind angegebene Sammlung.
lese ich containsAll Vertrag bedeutet, dass a.containsAll Aufruf (b) true zurück, wenn und nur wenn Aufruf a.contains (BELÉM) für jedes Element BELÉM in b zurückkehren würde wahr. Ich würde es auch bedeuten, dass a.containsAll (someEmptyCollection) ebenfalls true zurück. Wie Sie die javadocs für Abstract expliziter Zustand Dieser Zustand:
Diese Implementierung iteriert über die angegebene Sammlung, jede Überprüfung Element durch den Iterator zurück in drehen, um zu sehen, ob es in diesem enthalten ist Sammlung. Wenn alle Elemente sind so enthalten true zurückgegeben, andernfalls false.
Ich bin damit einverstanden, dass der Kontakt für Sammlung für containsAll sould expliziter sein, jede Möglichkeit für Verwirrung zu vermeiden. (Und dass das Lesen der javadocs für Abstract sollte nicht nötig gewesen derjenigediejenigedasjenige Verständnis Sammlung zu bestätigen)
ich habe nicht eine Annahme hinsichtlich der Anzahl von doppelten Elementen nach einem Aufruf von retainAll gemacht. Der angegebene Vertrag in Collection (durch meine Lesung) bedeutet nicht, oder so, wie Duplikate in jeder Sammlung behandelt werden würden. Basierend auf meiner Lektüre von retainAll in Sammlung mehr möglichen Ergebnisse von a.retainAll (b) sind alle vernünftig:
- Ergebnis enthält 1 jedes Element, das mindestens eine Kopie in sowohl a als auch b hat
- Ergebnis enthält jedes Element (einschließlich Duplikaten), die in einer war, mit Ausnahme derjenigen, die nicht in b
- oder sogar, enthält Ergebnis irgendwo zwischen 1 und der Anzahl der Kopien in einem jedes Element in einem gefunden, mit Ausnahme der nicht in b. Ich würde entweder zu erwarten # 1 oder # 2, würde aber eine der die drei übernehmen auf der Grundlage des Vertrages rechtmäßig.
Die javadocs für Abstract bestätigen, dass es verwendet # 2:
Diese Implementierung iteriert über diese Sammlung, wobei jedes Element Prüfen durch den Iterator wiederum zurück sehen, ob es in dem angegebenen enthalten ist Sammlung. Wenn es nicht so enthalten ist, es ist aus dieser Sammlung entfernt mit Der Remove-Methode des Iterators
Obwohl da diese Schnittstelle nicht in meiner Lektüre der ursprünglichen Sammlung ist der Vertrag, würde ich nicht unbedingt das Verhalten der Sammlung übernehmen im Allgemeinen auf diese Weise sein.
Vielleicht sollten Sie auf die JavaDoc vorgeschlagenen Updates Einreichung prüfen, sobald Sie fertig sind.
Wie zu ‚warum die Collection-Schnittstelle wurde so zweideutig links‘ - ich bezweifle ernsthaft, es absichtlich getan wurde -. Wahrscheinlich nur etwas, das ihre gebührende Priorität nicht gegeben wurde, als dass ein Teil der API geschrieben wurde
Andere Tipps
Ich glaube nicht, Sammlung es auf diese oder andere Weise definiert, aber es wurde einfach irgendwie eine Konvention Abstract Verhalten zu folgen, zum Beispiel: google-Sammlungen : siehe ihre Multiset Dokumentation (Multiset ist, was sie einen Beutel nennen)