Sind Enums typsichere Konstanten?

davidh38

Bekanntes Mitglied
Habe ich das richtig verstanden, dass Enums nur dazu da sind, damit ich mich bei Konstanten in mehrparametrigen Funktionen nicht vertue oder gibt es noch mehr Vorteile?
 
Enums sind Aufzählungen, richtige Objekte die zur Laufzeit fest vorgegeben sind, mit (fast) allen Vorteilen, wie Typsicherheit etc. pp.
 
Ich würde eher Aufzählungstyp sagen, bzw. Gruppierungsmöglichkeit von zusammengehörigen Werten.

Das wohl beliebteste Enum:

Java:
public enum month {
	JANUAR,
	FEBRUAR,
	MAERZ,
	APRIL,
	MAI,
	JUNI,
	JULI,
	AUGUST,
	SEPTEMBER,
	OKTOBER,
	NOVEMBER,
	DEZEMBER;
}

Mit Enums kannst du aber auch viel mehr machen, wie Größenvergleiche oder wäre auch die Ermittlung der Position im Enum möglich.

Was vielleicht noch wichtig ist, Enums sind nicht irgendwelche Konstanten. Im Idealfall hängen sie logisch/inhaltlich zusammen 😉

[Edit] Maki war schneller, mein Beitrag bezieht sich natürlich nicht auf seinen.
 
Zuletzt bearbeitet:
Ich würde eher Aufzählungstyp sagen, bzw. Gruppierungsmöglichkeit von zusammengehörigen Werten.

Das wohl beliebteste Enum:

Java:
public enum month {
	JANUAR,
	FEBRUAR,
	MAERZ,
	APRIL,
	MAI,
	JUNI,
	JULI,
	AUGUST,
	SEPTEMBER,
	OKTOBER,
	NOVEMBER,
	DEZEMBER;
}

Mit Enums kannst du aber auch viel mehr machen, wie Größenvergleiche oder wäre auch die Ermittlung der Position im Enum möglich.

Was vielleicht noch wichtig ist, Enums sind nicht irgendwelche Konstanten. Im Idealfall hängen sie logisch/inhaltlich zusammen 😉

[Edit] Maki war schneller, mein Beitrag bezieht sich natürlich nicht auf seinen.

Gut, aber Sachen aufzählen, kann ich auch mit Listen. Wo ist der Unterschied?
 
Enums können dazu eingesetzt werden den Code übersichtlicher zu machen. Wie bereits erwähnt wurde können Sie auch dazu dienen Vergleichs- und Umwandlungsmethoden zu enthalten um die Aufzählungselemente in weiterverarbeitbare Werte umwandeln zu können.

Wie du richtig sagst, bekommst du einen Compile-Time Check damit du dich nicht vertun kannst.

Was ich bis jetzt allerdings nicht verstehe ist, warum in switch keine Enums möglich sind. Was echt praktisch wäre und in anderen Sprachen wie z.B. C# (ja ich weiß, dort sind Enums gänzlich anders gelöst ...) möglich sind.
 
Was ich bis jetzt allerdings nicht verstehe ist, warum in switch keine Enums möglich sind. Was echt praktisch wäre und in anderen Sprachen wie z.B. C# (ja ich weiß, dort sind Enums gänzlich anders gelöst ...) möglich sind.
enums können problemlos geswitcht werden.
Gut, aber Sachen aufzählen, kann ich auch mit Listen. Wo ist der Unterschied?
Was ist lesbarer? [c]Foo foo = Bar.getFoo(FooTypes.SOME_FOO);[/c] oder [c]Foo foo = Bar.getFoo(fooTypes.get(2));[/c]? Und was passiert, wenn die Liste sich unbemerkt ändern sollte?
 
Was ich bis jetzt allerdings nicht verstehe ist, warum in switch keine Enums möglich sind. Was echt praktisch wäre und in anderen Sprachen wie z.B. C# (ja ich weiß, dort sind Enums gänzlich anders gelöst ...) möglich sind.
Klar kannst du Enums in nem switch verwenden. Wie kommst du drauf dass das nicht gehen sollte?
 
Kann ich enums auch als index in Arrays verwenden? (IMO verstecken sich dahinter ja int)

Java:
int[] arr = new int[MyEnum.values().length];
arr[enumWert.ordinal];

Sieht etwas kompliziert aus ;-)
 
Zuletzt bearbeitet:
Was ich bis jetzt allerdings nicht verstehe ist, warum in switch keine Enums möglich sind.

Sind sie doch!

Code:
14.11 The switch Statement
The switch statement transfers control to one of several statements depending on the value of an expression.


    SwitchStatement:
            switch ( Expression ) SwitchBlock

    SwitchBlock:
            { SwitchBlockStatementGroupsopt SwitchLabelsopt }

    SwitchBlockStatementGroups:
            SwitchBlockStatementGroup
            SwitchBlockStatementGroups SwitchBlockStatementGroup

    SwitchBlockStatementGroup:
            SwitchLabels BlockStatements

    SwitchLabels:
            SwitchLabel
            SwitchLabels SwitchLabel

    SwitchLabel:
            case ConstantExpression :
            case EnumConstantName : <---------------------------------------------------------
            default :

    EnumConstantName:
            Identifier

Blocks and Statements
 
Kann ich enums auch als index in Arrays verwenden? (IMO verstecken sich dahinter ja int)

Java:
int[] arr = new int[MyEnum.values().length];
arr[enumWert.ordinal];

Sieht etwas kompliziert aus ;-)
Sollte man nicht machen, wenn weitere Instanzen zum Enum hinzugefügt werden, kann sich der ordinal Wert einer Instanz schon mal ändern, insbesondere wenn man die enuen Instanzen nicht am Ende hinzufügt, sondern die Reihenfolge der alten ändert.
 
Sollte man nicht machen, wenn weitere Instanzen zum Enum hinzugefügt werden, kann sich der ordinal Wert einer Instanz schon mal ändern, insbesondere wenn man die enuen Instanzen nicht am Ende hinzufügt, sondern die Reihenfolge der alten ändert.

Na ja, dann verschiebt sich das halt - das geschieht ja nicht zur Laufzeit. Aber logisch sind Maps besser. Ich war nur gerade daran das in einem anderen Thread behandelte "Woerterbuch" zu imlementieren - der enum sind in dem Fall die Sprachen und wenn da eine dazukommt kommt sie halt dazu. Der TO hat dort mit arrays begonnen und dabei lassen wir es vorerst mal ;-)
 
Klar kannst du Enums in nem switch verwenden. Wie kommst du drauf dass das nicht gehen sollte?
Ich komme eigentlich aus der C#-Welt und bin erst nach letzten Dezember umgestiegen.

In C# funktioniert das ganze so:
Code:
  switch(myEnumVar) {
      case MyEnum.VALUE_1:
         break;
  }

Als ich das in Java probiert hab ging es nicht. Bin erst durch diesen Thread drauf gekommen, dass das ganze so funktioniert:

Code:
  switch(myEnumVar) {
     case VALUE_1:
        break;
  }

Lustig finde ich allerdings das 3 Leute hintereinander das Gleiche schreiben :-D Ich hoffe das Rätsel ist nun gelöst.
 
Habe ich das richtig verstanden, dass Enums nur dazu da sind, damit ich mich bei Konstanten in mehrparametrigen Funktionen nicht vertue oder gibt es noch mehr Vorteile?

Enums sind typischere Konstanten die die Lesbarkeit erhöhen. Das ist richtig, diese Vorteile hast du allerdings auch bei einparametringen Funktionen. Evtl. kann zusätzlich auf Eingenschaften "echter" Objekte zurückgegriffen werden.
Für meinen Geschmack wird ein Sprache dadurch unnötig aufgebläht.
 
Sicherheit ist immer ein "aufblähen" aber niemals unerwünscht 🙂 Wenn ich daran denke, dass im Projekt hier so vieles als String gespeichert wird was auch ein enum sein könnte, wird mir direkt übel.

Farben können "Rot" "Gruen" "Schwarz" etc sein - der Compiler hat natürlich keine Chance, wenn da jemand "Grün" schreibt und bei "gruen" geht es auch schief, weil der damalige Entwickler zu wenige weit gedacht hat :-( (oder er war zu bequem equalsIgnoreCase zu tippen weil das länger ist 😀 )

Viel lieber ein Enum und vieles was wir jetzt mit dem Debugger suchen müssen, würde von Compiler schon erkannt.
 

Zurück
Oben