Macht es Sinn, dass equals und compareTo inkonsistent sind?

7

Ich möchte eine Klasse in SortedSet | nutzbar machen SortedMap .

%Vor%

Die Instanzen der Klasse müssen nach ihrer Namenseigenschaft sortiert sein.
Ich möchte jedoch nicht, dass gleichnamige Instanzen als gleich angesehen werden.

Also würde ein SortedSet Inhalt wie a, a, a, b, c aussehen.
(Normalerweise erlaubt SortedSet nur a, b, c )

Zuallererst: Ist das (philosophisch) konsistent?

Wenn ja, muss ich unvorhersehbares Verhalten erwarten, wenn ich es nicht tue override equals(...) und hashCode() ?

Bearbeiten:
Es tut mir leid, meine Frage scheint inkonsistent zu sein:
Ich möchte mehrere "gleiche" Werte in einen Satz einfügen, was dies nicht erlaubt nach Konzept.
Also, bitte antworte nicht mehr auf meine Frage.
Danke an alle, die schon geantwortet haben.

    
ivan_ivanovich_ivanoff 27.04.2009, 19:34
quelle

4 Antworten

18

Lassen Sie mich Ihnen eine Frage stellen: Ist es sinnvoll, a.compareTo(b) return 0 und a.equals(b) return false ?

zu haben

Ich würde stattdessen eine Comparator<MyClass> verwenden. Das ist der Grund, warum alle SortedMap / SortedSet Implementierungen, die ich kenne, Ihnen erlauben, bei der Erstellung ein Comparator zu übergeben.

    
Michael Myers 27.04.2009, 19:37
quelle
4

Aus dem Javadoc für Vergleichbares

  

Es wird dringend empfohlen (obwohl nicht   erforderlich) dass natürliche Ordnungen sein müssen   konsistent mit Gleichgestellten. Das ist so   weil sortierte Sätze (und sortierte Karten)   ohne explizite Komparatoren zu verhalten   " seltsam ", wenn sie verwendet werden   Elemente (oder Schlüssel), deren natürliche   Bestellung ist inkonsistent mit gleich

Wenn Sie compareTo inkonsistent mit equals () haben möchten, sollten Sie stattdessen einen expliziten Komparator verwenden, indem Sie eine Klasse bereitstellen, die Comparator implementiert.

  

Wenn ja, muss ich unvorhersehbares Verhalten erwarten, wenn ich equals (...) und hashcode () nicht überschreibe?

Sie sollten weiterhin equals () und hashcode () überschreiben. Ob equals () und hashcode () mit compareTo übereinstimmen, ist eine andere Sache.

    
Laplie Anderson 27.04.2009 19:44
quelle
2

Effektives Java empfiehlt, dass Sie, wenn Sie compareTo nicht konsistent mit equals implementieren, sollten deutlich angeben:

  

Die empfohlene Sprache ist "Hinweis:   Diese Klasse hat eine natürliche Reihenfolge   ist inkonsistent mit Gleichgestellten. "

    
Fabian Steeg 27.04.2009 19:41
quelle
0

Fügen Sie diesen Code einfach in die equals-Methode ein und denken Sie nie wieder darüber nach:

%Vor%     
Azder 27.04.2009 19:42
quelle

Tags und Links