Warum unterstützt Java keinen Equality-Vergleich in den Comparator-Zeilen?

8

Java bietet die Möglichkeit, einen Vergleich von Objekten außerhalb des Bereichsobjekts mit Comparator zu definieren.

Nun ist meine Frage, warum Java es nicht erlaubt, dasselbe für equals () und hashcode () zu tun.

Jetzt kann jede Sammlung contains() -Methode diesen externen Gleichheitsanbieter verwenden, um zu überprüfen, ob Objekte gleich sind.

    
Amit Deshpande 12.09.2012, 14:14
quelle

3 Antworten

3

Guava hat die Equivalence Klasse, die ziemlich genau das tut, was Sie verlangen.

Sie können sogar ein Objekt in eine Equivalence umbrechen, um ein Objekt mit einer besseren hashCode () equals () Implementierung zu dekorieren (zB wenn Sie ein Objekt mit einem schlechten equals () hashCode () als Map-Schlüssel verwenden wollen) aber keinen Zugriff auf die Quellen haben)

Hier ist ein Beispiel: Arrays haben keine richtigen Implementierungen von equals () und hashCode (), aber hier ist eine Äquivalenz für char-Arrays:

%Vor%

Beispielcode:

%Vor%     
Sean Patrick Floyd 12.09.2012, 14:42
quelle
0

Comparator-Schnittstelle wird verwendet, um Objekte beim Sortieren von Sammlungen zu vergleichen, und seine compare () -Methode gibt ein "int" zurück, dh Vergleich endet mit einem int-Wert, der verwendet werden kann, um den Platz eines Objekts in einer sortierten Sammlung anzugeben.

contains () ruft die equals () -Methode für jede Instanz in einer Sammlung auf, um herauszufinden, ob zwei Instanzen gleich laut sind.

    
Erhan Bagdemir 12.09.2012 14:23
quelle
0

equals und hashCode sind Konzepte, die sich für eine gegebene Object nicht ändern. Nur der Implementierer weiß, welche Werte verwendet werden sollten nach den Regeln für diese Methoden. Sobald er sich für diese entschieden hat, definieren sie die Identität des Objekts und sollten daher niemals verändert werden.

Die Vergleichbarkeit kann dagegen stark vom Kontext abhängen. Sie können einen "natürlichen" Auftrag definieren, indem Sie Comparable implementieren. Aber das kann sich für verschiedene Kontexte nicht ändern. Angenommen, Sie haben eine Liste mit Kontakten, die nach Nachname, Vorname, Postleitzahl, Ort usw. sortiert werden können. Sie können dies ganz einfach tun, indem Sie Comparator s (oder eine parametrisierte Comparator ) angeben. Aber es ist nicht inhärent für das Objekt selbst, also sollte es eine eigene Klasse sein (es könnte als statische innere Klasse implementiert werden, abhängig von Ihren Code-Konventionen).

    
Hauke Ingmar Schmidt 12.09.2012 14:36
quelle

Tags und Links