605 Stimmen

Was sind enums und warum sind sie nützlich?

Heute habe ich einige Fragen auf dieser Website durchgesehen und eine Erwähnung eines enum im Singleton-Muster gefunden, das angeblich thread-sichere Vorteile für eine solche Lösung bietet.

Ich habe noch nie enums verwendet und programmiere seit mehr als ein paar Jahren in Java. Und anscheinend haben sie sich viel verändert. Jetzt unterstützen sie sogar vollständige OOP innerhalb sich selbst.

Warum und wofür sollte ich enums im täglichen Programmieren verwenden?

10 Stimmen

1 Stimmen

Sie können Enums nicht instanziieren, da diese einen privaten Konstruktor haben. Sie werden beim Starten der JVM instanziiert, also handelt es sich um Singletons. Enums sind nicht thread-sicher.

0 Stimmen

Ich stimme dafür, diese Frage zu schließen, weil dieses Meta das besagt: meta.stackoverflow.com/questions/429367/closing-consistency

9voto

tinker_fairy Punkte 1315

Was ist ein Enum

  • Enum ist ein Schlüsselwort, das für die Aufzählung eines neuen Datentyps definiert wurde. Typsichere Aufzählungen sollten großzügig verwendet werden. Insbesondere sind sie eine robuste Alternative zu den einfachen String- oder int-Konstanten, die in wesentlich älteren APIs verwendet werden, um Gruppen von verwandten Elementen darzustellen.

Warum ein Enum verwenden

  • Enums sind implizit finale Unterklassen von java.lang.Enum
  • Wenn ein Enum-Mitglied einer Klasse ist, ist es implizit statisch
  • new kann nie mit einem Enum verwendet werden, selbst innerhalb des Enum-Typs selbst
  • name und valueOf verwenden einfach den Text der Enum-Konstanten, während toString überschrieben werden kann, um bei Bedarf Inhalte bereitzustellen
  • Für Enum-Konstanten sind equals und == im Grunde dasselbe und können austauschbar verwendet werden
  • Enum-Konstanten sind implizit public static final

Hinweis

  • Enums können keine Klasse erweitern.
  • Ein Enum kann nicht eine Superklasse sein.
  • Die Reihenfolge des Erscheinens von Enum-Konstanten wird als ihre "natürliche Reihenfolge" bezeichnet und definiert die Reihenfolge, die auch von anderen Elementen verwendet wird: compareTo, Iterationsreihenfolge von Werten, EnumSet, EnumSet.range.
  • Eine Aufzählung kann Konstruktoren, statische und Instanzblöcke, Variablen und Methoden haben, kann jedoch keine abstrakten Methoden haben.

7voto

abishkar bhattarai Punkte 7113

Enum erbt alle Methoden der Klasse Object und der abstrakten Klasse Enum. Daher können Sie seine Methoden für Reflektion, Multithreading, Serialisierung, Vergleich usw. verwenden. Wenn Sie nur eine statische Konstante anstelle von Enum deklarieren, können Sie das nicht. Außerdem kann der Wert von Enum auch an die DAO-Schicht übergeben werden.

Hier ist ein Beispielprogramm zur Demonstration.

public enum State {

    Start("1"),
    Wait("1"),
    Notify("2"),
    NotifyAll("3"),
    Run("4"),
    SystemInatilize("5"),
    VendorInatilize("6"),
    test,
    FrameworkInatilize("7");

    public static State getState(String value) {
        return State.Wait;
    }

    private String value;
    State test;

    private State(String value) {
        this.value = value;
    }

    private State() {
    }

    public String getValue() {
        return value;
    }

    public void setCurrentState(State currentState) {
        test = currentState;
    }

    public boolean isNotify() {
        return this.equals(Notify);
    }
}

public class EnumTest {

    State test;

    public void setCurrentState(State currentState) {
        test = currentState;
    }

    public State getCurrentState() {
        return test;
    }

    public static void main(String[] args) {
        System.out.println(State.test);
        System.out.println(State.FrameworkInatilize);
        EnumTest test=new EnumTest();
        test.setCurrentState(State.Notify);
        test. stateSwitch();
    }

    public void stateSwitch() {
        switch (getCurrentState()) {
        case Notify:
            System.out.println("Notify");
            System.out.println(test.isNotify());
            break;
        default:
            break;
        }
    }
}

5voto

Christophe Roussy Punkte 15183

Verwenden Sie Enums für Typensicherheit, dies ist ein Sprachmerkmal, das Sie normalerweise erhalten:

  • Compilerunterstützung (Sie sehen sofort Typprobleme)
  • Unterstützung von Tools in IDEs (automatische Vervollständigung im switch-case, fehlende Fälle, Erzwingen von Standardwerten, ...)
  • In einigen Fällen ist die Leistung von Enums auch großartig (EnumSet, typsichere Alternative zu traditionellen int-basierten "Bit-Flags.")

Enums können Methoden, Konstruktoren haben, Sie können sogar Enums in Enums verwenden und Enums mit Schnittstellen kombinieren.

Denk an Enums als Typen, um einen klar definierten Satz von int-Konstanten zu ersetzen (die Java 'geerbt' hat von C/C++) und in einigen Fällen um Bit-Flags zu ersetzen.

Das Buch Effective Java 2. Edition hat ein ganzes Kapitel darüber und geht in mehr Details. Siehe auch diesen Stack Overflow Beitrag.

4voto

Rafa Punkte 2298

Nach meiner Meinung sind alle Antworten, die Sie bisher erhalten haben, gültig, aber meiner Erfahrung nach würde ich es in wenigen Worten ausdrücken:

Verwenden Sie Enums, wenn Sie möchten, dass der Compiler die Gültigkeit des Werts eines Bezeichners überprüft.

Andernfalls können Sie weiterhin Zeichenfolgen verwenden (wahrscheinlich haben Sie bereits einige "Konventionen" für Ihre Anwendung definiert) und Sie werden sehr flexibel sein... aber Sie erhalten keine 100%ige Sicherheit gegen Tippfehler in Ihren Zeichenfolgen und Sie werden sie nur zur Laufzeit erkennen.

4voto

Steve Punkte 1469

ENum steht für "Aufzählungstyp". Es handelt sich um einen Datentyp mit einem festen Satz von Konstanten, die Sie selbst definieren.

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