Ist es in Ordnung, ==
Enums in Java zu verwenden, oder muss ich es verwenden .equals()
? Funktioniert bei meinen Tests ==
immer, aber ich bin mir nicht sicher, ob mir das garantiert ist. Insbesondere gibt es keine .clone()
Methode für eine Aufzählung, daher weiß ich nicht, ob es möglich ist, eine Aufzählung zu erhalten, für die .equals()
ein anderer Wert als zurückgegeben wird ==
.
Ist das zum Beispiel in Ordnung:
public int round(RoundingMode roundingMode) {
if(roundingMode == RoundingMode.HALF_UP) {
//do something
} else if (roundingMode == RoundingMode.HALF_EVEN) {
//do something
}
//etc
}
Oder muss ich es so schreiben:
public int round(RoundingMode roundingMode) {
if(roundingMode.equals(RoundingMode.HALF_UP)) {
//do something
} else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
//do something
}
//etc
}
Antworten:
Nur meine 2 Cent: Hier ist der Code für Enum.java, wie er von Sun veröffentlicht wurde und Teil des JDK:
quelle
Ja, == ist in Ordnung - es gibt garantiert nur eine einzige Referenz für jeden Wert.
Es gibt jedoch eine bessere Möglichkeit, Ihre runde Methode zu schreiben:
Eine noch bessere Möglichkeit besteht darin, die Funktionalität in die Enumeration selbst zu integrieren, sodass Sie einfach anrufen können
roundingMode.round(someValue)
. Dies bringt Java-Enums auf den Punkt - sie sind objektorientierte Enums, im Gegensatz zu den "benannten Werten", die an anderer Stelle zu finden sind.EDIT: Die Spezifikation ist nicht sehr klar, aber Abschnitt 8.9 besagt:
quelle
Ja, es ist, als hätten Sie Singleton-Instanzen für jeden Wert in der Aufzählung erstellt:
Allerdings , das
enum
gibt Konstrukt Ihnen verschiedene Vorteile:switch-case
Kontrollstruktur mit Konstanten verglichen werden.values
Felds abgefragt werden, das für jeden Aufzählungstyp "generiert" wirdDie Serialisierung ist eine große Gotchya. Wenn ich den obigen Code anstelle einer Aufzählung verwenden würde, würde sich die Identitätsgleichheit folgendermaßen verhalten:
Sie können ohne Enum dieses Problem beheben, eine Technik , die beinhaltet
writeReplace
undreadResolve
, (siehe http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...Ich denke, der Punkt ist: Java gibt sich alle Mühe, die Identität von Enum-Werten zum Testen der Gleichheit zu verwenden. Es ist eine ermutigte Praxis.
quelle
== vergleicht die Referenzen zweier Objekte. Für Aufzählungen wird garantiert, dass es nur eine Instanz gibt, und daher ist == für zwei Aufzählungen, die gleich sind, wahr.
Referenz:
http://www.ajaxonomy.com/2007/java/making-the-most-of-java-50-enum-tricks
(konnte nichts in den Sun-Dokumenten finden)
quelle
Hier ist ein böser Code, den Sie vielleicht interessant finden. : D.
quelle
Unsafe.class
.Aufzählungen sind ein großartiger Ort, um polymorphen Code zu stören.
quelle
Beachten Sie, dass beim Übertragen von Enum über RMI / IIOP ein Problem auftritt. Siehe diesen Thread:
http://www.velocityreviews.com/forums/t390342-enum-equality.html
quelle
== ist im Allgemeinen in Ordnung und es gibt Vorteile für == und
.equals()
. Ich persönlich bevorzuge es immer,.equals()
wenn ich Objekte vergleiche, einschließlichenum
s. Siehe auch diese Diskussion:Java-Enum-Mitglieder vergleichen: == oder equals ()?
quelle