2010-06-03 7 views
33

Ich habe bemerkt, dass der folgende Code-Schnipsel ...Warum Java das Überschreiben von Gleichheitszeichen (Object) in einem Enum nicht zulässt?

@Override 
public boolean equals(Object otherObject) { 
    ... 
} 

... ist für eine Enum nicht erlaubt, da das Verfahren equals(Object x) als final in Enum definiert ist. Warum ist das so?

Ich kann mir keinen Anwendungsfall vorstellen, der equals(Object) für Enum überschreiben würde. Ich bin nur neugierig auf die Gründe für dieses Verhalten.

Antwort

33

Alles andere als return this == other wäre kontra intuitiv und verletzen the principle of least astonishment. Es wird erwartet, dass zwei Enum-Konstanten genau dann equal sind, wenn sie dasselbe Objekt sind und die Fähigkeit, dieses Verhalten zu überschreiben, fehleranfällig ist.

Gleiche gilt für hashCode(), clone(), compareTo(Object), name(), ordinal() und getDeclaringClass().


Während die JLS motivieren nicht die Wahl, es endgültig zu machen, erwähnt aber gleich im Zusammenhang mit Aufzählungen here. Snippet:

Das Verfahren in Enum entspricht ist eine endgültige Methode, die nur super.equals auf ihr Argument aufruft und das Ergebnis zurückgibt, so dass eine Identitätsvergleich durchzuführen.

0

Gerade weil die Java-Designer keinen denkbaren Anwendungsfall für das Überschreiben von Enum.equals (Object) denken konnten, wird diese Methode als final deklariert - so dass ein solches Überschreiben unmöglich wäre.

3

Es gibt bereits eine starke intuitive Vorstellung davon, was es für Instanzen (Werte) von enum bedeutet, gleich zu sein. Die Überladung der equals Methode würde dazu führen, dass diese Vorstellung verletzt wird, was zu unerwartetem Verhalten, Fehlern usw. führt.

0

Ich muss zugeben, Aufzählungen das letzte, was sind ich möchte equals() in außer Kraft zu setzen.

Ich denke, der Grund equals() in Aufzählungen endgültig ist, ist, dass Java ermutigt == für Enum Vergleich und die Umsetzung von equals() in enums verwendet es einfach, so dass equals() vor dem Übersteuern ist zu verhindern, dass == und equals() sich anders verhalten, was etwas andere Entwickler nicht erwarten würde.