2153 Stimmen

Vergleich von Java-Enum-Mitgliedern: == oder equals()?

Ich weiß, dass Java-Enums zu Klassen mit privaten Konstruktoren und einer Reihe von öffentlichen statischen Mitgliedern kompiliert werden. Wenn ich zwei Mitglieder einer gegebenen enum vergleiche, habe ich immer .equals() z.B.

public useEnums(SomeEnum a)
{
    if(a.equals(SomeEnum.SOME_ENUM_VALUE))
    {
        ...
    }
    ...
}

Ich bin jedoch gerade auf einen Code gestoßen, der den Gleichheitsoperator verwendet == anstelle von .equals():

public useEnums2(SomeEnum a)
{
    if(a == SomeEnum.SOME_ENUM_VALUE)
    {
        ...
    }
    ...
}

Welchen Operator sollte ich verwenden?

7 Stimmen

Ich bin gerade über eine sehr ähnliche Frage gestolpert: stackoverflow.com/questions/533922/

73 Stimmen

Ich bin überrascht, dass in all den Antworten (insbesondere in der von polygenelubricants, die detailliert erklärt, warum == funktioniert) ein weiterer großer Vorteil von == nicht erwähnt wurde: dass es explizit macht, wie Enums funktionieren (als eine feste Menge von Singleton-Objekten). Bei equals könnte man meinen, dass es irgendwie mehrere Instanzen der gleichen Enum-'Alternative' geben kann.

3 Stimmen

SomeEnum.SOME_ENUM_VALUE.equals(a) löst niemals eine NullPointerException aus, während a.equals(SomeEnum.SOME_ENUM_VALUE) dies möglicherweise tut.

3voto

Jacob van Lingen Punkte 8247

Zu all den anderen hervorragenden Antworten möchte ich nur noch eines hinzufügen. Wenn Sie ein einfaches Lambda verwenden, bevorzuge ich equals== denn Sie können eine Methodenreferenzierung verwenden.

Beachten Sie die folgenden Lambdas:

Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(e -> e == SomeEnum.B);
Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(e -> e.equals(SomeEnum.B));

Letzteres kann in umgewandelt werden:

Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(SomeEnum.B::equals));

2voto

Dev Amitabh Punkte 185

Enums funktionieren deshalb so gut mit ==, weil jede definierte Instanz auch ein Singleton ist. Der Identitätsvergleich mit == wird also immer funktionieren.

Aber die Verwendung von ==, weil es mit Enums funktioniert, bedeutet, dass Ihr gesamter Code eng mit der Verwendung dieses Enums gekoppelt ist.

Zum Beispiel: Enums können eine Schnittstelle implementieren. Angenommen, Sie verwenden derzeit eine Enum, die Interface1 implementiert. Wenn später jemand dies ändert oder eine neue Klasse Impl1 als Implementierung derselben Schnittstelle einführt. Wenn Sie dann anfangen, Instanzen von Impl1 zu verwenden, müssen Sie aufgrund der früheren Verwendung von == eine Menge Code ändern und testen.

Daher ist es am besten, sich an das zu halten, was als gute Praxis gilt, es sei denn, es gibt einen begründeten Vorteil.

-1voto

Christ Punkte 450

Ich möchte die Antwort von polygenelubricants ergänzen:

Ich persönlich bevorzuge equals(). Aber die Kompatibilitätsprüfung des Typs bleibt bestehen. Was meiner Meinung nach eine wichtige Einschränkung ist.

Um die Typkompatibilität zur Kompilierungszeit zu prüfen, deklarieren und verwenden Sie eine benutzerdefinierte Funktion in Ihrer Enum.

public boolean isEquals(enumVariable) // compare constant from left
public static boolean areEqual(enumVariable, enumVariable2) // compare two variable

Damit haben Sie alle Vorteile der beiden Lösungen: NPE-Schutz, leicht lesbarer Code und Typkompatibilitätsprüfung zur Kompilierungszeit.

Ich empfehle auch, einen UNDEFINED-Wert für enum hinzuzufügen.

-1voto

glglgl Punkte 84928

Kurz gesagt, beide haben Vor- und Nachteile.

Einerseits hat es Vorteile, Folgendes zu verwenden == wie in den anderen Antworten beschrieben.

Wenn Sie jedoch aus irgendeinem Grund die Enums durch einen anderen Ansatz (normale Klasseninstanzen) ersetzen, nachdem Sie == beißt dich. (BTDT.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X