Java enums mit == oder .equals() auf Gleichheit prüfen?

Die Frage wie man die in Java 5 eingeführten enum Typen am besten auf Gleichheit prüft scheint durchaus berechtigt. Wird man doch oft genug gerügt und gemahnt in Java nie mit == sondern immer mit .equals()auf Gleichheit zu prüfen. Diese Aussage lässt sich auch leicht mit z.B. zwei Interger Objekten überprüfen, wie der folgende Schnipsel zeigt:

Integer i1 = new Integer(2);
Integer i2 = new Integer(2);

System.out.println(i1 == i2);      // Ausgabe: false
System.out.println(i1.equals(i2)); // Ausgabe: true

Nun aber die Frage nach dem Überprüfen eines enums. Hat man z.B. folgendes Java enum:

public enum EnumEqualTest {
  EINS, ZWEI, DREI;
}

Und anschließend wieder die folgende Gleichheitsabfrage mit dem System.out:

EnumEqualTest e1 = EnumEqualTest.ZWEI;
EnumEqualTest e2 = EnumEqualTest.ZWEI;

System.out.println(e1 == e2);      // Ausgabe: true
System.out.println(e1.equals(e2)); // Ausgabe: true

Beide System.out’s geben true aus. Der Test zeigt also, dass die Überprüfung mit == für enum Typen funktioniert. Jetzt stellt sich nur noch die Frage ob das auch empfohlen ist. Ähnlich wie bei Strings könnte es ja durch die besondere Behandlung des enum Typs “zufällig” funktionieren.

Um das ganze kurz zu machen: Enum Konstanten sind implizit public static final und somit statische Variablen. Statische Variablen gehören zur Klasse, werden daher mit der Klasse selbst im Heap abgelegt und haben immer die gleiche Referenz. Aus diesem Grund kann man auf die statischen Variablen auch immer nur über die Klasse gelangen wie z.B. EnumEqualTest.ZWEI. Das ist auch der Grund warum man auch mit dem == Operator die Gleichheit überprüfen kann.

Schaut man sich im Quellcode des enum Typs die methode equals() mal genauer an sieht man neben der final Deklaration auch, dass equals() selbst mit dem == Operator die Gleichheit prüft:

enum.equals() Methode

Somit ist es eigentlich total egal für welche Variante man sich entscheidet den beide münden im == Operator Ausdruck.
Einen nennenswerten großen Vorteil hat allerdings die Variante direkt mit dem == Operator zu arbeiten: Der Compiler erkennt wenn die Typen nicht zueinander passen:

enum equals Compiler Fehler

Es erscheint der Compiler Fehler “Incompatible operand types ... and ...“. Somit erspart man sich lästige Fehler die später gesucht werden müssen.

Nun ist die Erläuterung auf die Frage nach der besseren Variante der Gleichheitüberprüfung von enum Typen doch etwas länger ausgefallen =).

Tags: ,

Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch einen Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.

Ähnliche Artikel, die dich interessieren könnten:
Kommentare

Eine großartige, auf den Punkt gebrachte Zusammenfassung. Das implizite static war mir bisher noch gar nicht richtig ins Bewusstsein gerutscht.

[...] Java enums mit == oder .equals() auf Gleichheit prüfen? [...]

Bei Autoboxing von Integers gilt für Integer i1=2,i2=2; i1==i2, da i1=Integer.valueOf(2) wie i2 und _nicht_ i1=Integer(2). Wer initialisiert denn so?? Bei enums ist es ja ähnlich, da die Elements quasie Klassenkonstanten sind.

Mir ging es in diesem Beispiel weniger um die Initialisierung als um den Effekt, dass man Objekte mit .equals() auf Gleichheit prüfen sollte. Der Effekt geht natürlich mit Integer.valueOf() verloren. Benötigt man keine neuen Integer Instanzen sollte man die empfohlene Variante Integer.valueOf() verwenden. Da ich in meinem kleinen Beispiel allerdings neue Instanzen benötigte ist der Weg über den Konstruktor schon in Ordnung. Evtl. hätte ich nicht Integer sondern einen anderen Typ für das Beispiel verwenden sollen.
Danke für den Hinweis =)

Hallo,

du schreibst das man mit dem “==” Operator die Gleichheit überprüfen kann. Das ist falsch. mit “==” wird die Identität der Objekte geprüft.

Integer i1 = new Integer(2);
Integer i2 = new Integer(2);

Es steht außer Frage das man hier nicht mit == prüfen darf, wenn mann die Inhalte der Objekte, die durch die Variablen bezeichnet werden, prüfen möchte.

Die Identitätsprüfung wird in diesem Fall immer false ergeben, da es sich bei i1 nicht um dasselbe Objekt wie i2 handelt auf die die Referenzen zeigen. Es wird in Java stets mit equals() auf Gleichheit überprüft. ( Gleicher Inhalt der Objekte )

„==“ oder „!=“ -> Prüfung auf gleiche/ungleiche Identität zweier Objekte.
„equals()“ -> Prüfung auf Gleichheit zweier Objekte. ( Dasselbe ist nicht dasgleiche wie dasgleiche )

Das erklärt doch warum die Prüfung auf gleiche Identität und Gleichheit bei Enums beides true ergibt.

Grüße,

IOLAUS

PS: Bei i1=2,i2=2; i1==i2 ist es klar wenn man weiss, das primitive Datentypen in Java per Wertesemantik gespeichert werden.

Hi IOLAUS,

hättest du meinen Artikel richtig gelesen hättest du auch gesehen, dass ich nicht schreibe, dass man mit == auf Gleichheit prüfen soll.

Wird man doch oft genug gerügt und gemahnt in Java nie mit == sondern immer mit .equals()auf Gleichheit zu prüfen.

Es wird auch erläutert warum es durch aus Sinnvoll ist gerade bei enums mit == zu prüfen und, dass es bei enums intern sogar auch direkt so umgesetzt ist (siehe Quellcode Screenshot).

Wie auch immer, ansonsten hast du natürlich mit deiner Aussage vollkommen recht – somit vielen Dank für deinen Kommentar! =)

Guter Artikel, habe mich damit vor kurzem auch befasst, kann demnach auch nur zustimmen ;)

[...] Java Equals Web: equals() in Java | ingokallenbach.de Die equals() Methode gehört in Java automatisch zur öffentlichen Schnittstelle einer jeden Klasse, da sie jede Klasse von Object automatisch erbt. http://www.ingokallenbach.de/2008/07/24/equals-in-java – besuchen Java: ==, .equals(), compareTo(), and– Java Notes ==, .equals(), compareTo(), and compare() Equality comparison: One way for primitives, Four ways for objects http://www.leepoint.net/notes-java/data/expressions/22compareobjects.html – besuchen Java enums mit == oder .equals() auf Gleichheit prüfen? Blog rund Java und Web Entwicklungthemen … Die Frage wie man die in Java 5 eingeführten enum Typen am besten auf Gleichheit prüft scheint durchaus berechtigt. javathreads.de/2009/05/java-enums-mit-oder-equals-auf-gleichheit-pruefen – besuchen [...]

Hinterlasse einen Kommentar