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

21voto

James P. Punkte 18665

Warum sollte ich enum im täglichen Programmieren verwenden?

Sie können ein Enum verwenden, um eine kleine, feste Menge von Konstanten oder einen internen Klassenmodus darzustellen und die Lesbarkeit zu erhöhen. Enums können auch eine gewisse Strenge durchsetzen, wenn sie in Methodenparametern verwendet werden. Sie bieten die interessante Möglichkeit, Informationen an einen Konstruktor zu übergeben, wie im Planetenbeispiel auf der Oracle-Website und ermöglichen auch auf einfache Weise die Erstellung eines Singleton-Musters.

Zum Beispiel liest sich Locale.setDefault(Locale.US) besser als Locale.setDefault(1) und erzwingt die Verwendung des festgelegten Wertesatzes, der in einer IDE angezeigt wird, wenn Sie den . Separator anstelle aller Ganzzahlen hinzufügen.

15voto

Premraj Punkte 65511

enum bedeutet Enumerierung, d. h. Nennung (einer Anzahl von Dingen) nacheinander.

Ein enum ist ein Datentyp, der eine feste Menge von Konstanten enthält.

ODER

Ein enum ist wie eine class, mit einer festen Menge von Instanzen, die zur Kompilierzeit bekannt sind.

Zum Beispiel:

public class EnumExample {
    interface SeasonInt {
        String seasonDuration();
    }

    private enum Season implements SeasonInt {
        // außer den Enum-Konstanten sieht der restliche Code genauso aus wie bei einer Klasse
        // Enum-Konstanten sind implizit public static final, wir haben Großbuchstaben verwendet, um sie wie Konstanten in Java zu spezifizieren
        WINTER(88, "DEC - FEB"), SPRING(92, "MAR - JUN"), SUMMER(91, "JUN - AUG"), FALL(90, "SEP - NOV");

        private int days;
        private String months;

        Season(int days, String months) { // Hinweis: Konstruktor ist standardmäßig privat
            this.days = days;
            this.months = months;
        }

        @Override
        public String seasonDuration() {
            return this+" -> "+this.days + "days,   " + this.months+" months";
        }

    }
    public static void main(String[] args) {
        System.out.println(Season.SPRING.seasonDuration());
        for (Season season : Season.values()){
            System.out.println(season.seasonDuration());
        }

    }
}

Vorteile von enum:

  • enum verbessert die Typsicherheit durch Kompilierzeitprüfung, um Fehler zur Laufzeit zu vermeiden.
  • enum kann leicht in switch verwendet werden
  • enum kann durchlaufen werden
  • enum kann Felder, Konstruktoren und Methoden haben
  • enum kann viele Schnittstellen implementieren, aber keine Klasse erweitern, da es intern die Klasse Enum erweitert

für mehr Informationen

15voto

Ad Infinitum Punkte 3272

Es ist nützlich zu wissen, dass enums genauso wie die anderen Klassen mit konstanten Feldern und einem privaten Konstruktor sind.

Zum Beispiel,

public enum Wochentag
{
  MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG
} 

Der Compiler kompiliert es wie folgt;

class Wochentag extends Enum
{
  public static final Wochentag MONTAG  = new Wochentag( "MONTAG",   0 );
  public static final Wochentag DIENSTAG = new Wochentag( "DIENSTAG ", 1 );
  public static final Wochentag MITTWOCH= new Wochentag( "MITTWOCH", 2 );
  public static final Wochentag DONNERSTAG= new Wochentag( "DONNERSTAG", 3 );
  public static final Wochentag FREITAG= new Wochentag( "FREITAG", 4 );
  public static final Wochentag SAMSTAG= new Wochentag( "SAMSTAG", 5 );
  public static final Wochentag SONNTAG= new Wochentag( "SONNTAG", 6 );

  private Wochentag( String s, int i )
  {
    super( s, i );
  }

  // andere Methoden...
}

15voto

afsantos Punkte 5088

Enums enumerieren eine feste Menge von Werten auf eine selbst dokumentierende Weise.
Sie machen Ihren Code expliziter und auch weniger fehleranfällig.

Warum also String oder int verwenden, anstatt Enum für Konstanten?

  1. Der Compiler lässt weder Tippfehler zu noch Werte außerhalb der festen Menge, da enums an sich Typen sind. Konsequenzen:
    • Sie müssen keine Vorbedingung schreiben (oder ein manuelles if), um sicherzustellen, dass Ihr Argument im gültigen Bereich liegt.
    • Die Typinvariante ist kostenlos.
  2. Enums können Verhalten haben, genauso wie jede andere Klasse.
  3. Sie würden wahrscheinlich eine ähnliche Menge an Speicher benötigen, um Strings zu verwenden, sowieso (das hängt von der Komplexität des Enum ab).

Darüber hinaus ist jede Instanz des Enum eine Klasse, für die Sie ihr individuelles Verhalten definieren können.

Zudem stellen sie bei der Erstellung der Instanzen (beim Laden des Enum) die Thread-Sicherheit sicher, was in der Vereinfachung des Singleton-Musters große Anwendung gefunden hat.

Dieses Blog illustriert einige seiner Anwendungen, wie beispielsweise eine Zustandsmaschine für einen Parser.

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.

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