Haben containsAll () und retainAll () in der Collection-Schnittstelle Adresse Mächtigkeit?

StackOverflow https://stackoverflow.com/questions/816379

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

War es hilfreich?

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:

  1. Ergebnis enthält 1 jedes Element, das mindestens eine Kopie in sowohl a als auch b
  2. hat
  3. Ergebnis enthält jedes Element (einschließlich Duplikaten), die in einer war, mit Ausnahme derjenigen, die nicht in b
  4. 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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top