Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer Programmiertechnik Aufzählungstypen
Was sind Aufzählungstypen? Aufzähltypen sind: selbstdefinierte Datentypen definiert über die explizite Aufzählung ihrer möglichen Werte Aufzählungstypen nennt man auch: Enumerationen oder kurz: Enums 2/16
Was sind Aufzählungstypen? Beispiele: Himmelsrichtung = { Nord, Ost, Sued, West } Wochentag = { Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag } Eissorte = { Himbeere, Vanille, Schokolade, Pistazie } Filmgenre = { Komödie, Drama, Zeichentrick, Reality, ScienceFiction } Wie man sieht, werden in Aufzähltypen artverwandte Dinge zusammengefasst. 3/16
Was sind Aufzählungstypen? In einer Sprache, die Aufzähltypen unterstützt, kann man eigene Aufzähltypen definieren (etwa wie auf der vorherigen Folie); Variablen eines Aufzähltyps deklarieren: Eissorte meineis; Werte an diese Variablen zuweisen: meineis = Himbeere; 4/16
Was sind Aufzählungstypen? Aufzähltypen in Switch-Anweisungen verwenden: switch ( meineis ) { case Himbeere: System.out.println("Himbeere"); break; case Vanille: System.out.println("Vanille"); break; } 5/16
Was sind Aufzählungstypen? Aufzählungstypen haben eine Reihe von Vorteilen: Gut lesbar (sprechender Name statt z. B. Nummer) Vermeiden Fehler durch Typsicherheit (ungültige Werte lehnt bereits der Compiler ab) Wie lässt sich so etwas umsetzen? Verschiedene Implementierungsansätze Aufzählungstypen in Java 6/16
Aufzählungstypen in Java Aufzählungstypen könnten in Java durch geeignete Klassendefinitionen typsicher simuliert werden. (hier nicht im Detail behandelt) Der Aufwand dafür ist allerdings relativ hoch, das Ergebnis wirkt recht komplex. Das Schema zur Simulation von "Aufzählungstypklassen" ist immer dasselbe. Dies sind gute Gründe, Aufzählungstypen direkt in der Sprache zu unterstützen! 7/16
Aufzählungstypen in Java Bis Java 4 nicht unterstützt, wurden beim ursprünglichen Sprachentwurf als unnötig betrachtet. Mit Java 5 wurden Aufzählungstypen nachträglich mit in den Sprachumfang aufgenommen. Bemerkung: In frühen Java-Varianten (vor Java 5) kann das Verhalten von Aufzählungstypen durch geeignete Klassendefinitionen simuliert werden ( Variante nach James Gosling ) 8/16
Java enum Java unterstützt ab Version 5 Aufzähltypen als spezielle Klassen: Syntaxregel public enum <EnumName> { <Wert1>, <Wert2>,, <Wertn>; } Beispiel: public enum Eissorte { Himbeere, Vanille, Schoko, Pistazie; } 9/16
Java enum Intern wandelt Java eine enum-definition um in eine "normale" Klasse jede enum-konstante ist eigentlich ein Objekt. Jedes dieser Objekte hat die Methoden: tostring(): liefert den Namen der Konstante als Zeichenkette. equals(object o): true, falls die Enum-Konstante und das Objekt o übereinstimmen. ordinal() : liefert die Ordinalzahl der Konstante 10/16
Java enum Jede enum-klasse MeineAufzaehlung enthält eine Klassenmethode values(), die ein Feld zurückliefert, das alle Werte enthält: public static MeineAufzaehlung[] values(); Verwendung: Was ergibt der folgende Ausdruck? Eissorte lieblingssorte = Eissorte.values() [Eissorte.Vanille.ordinal()]; 11/16
Java enum - Verwendung Verwendung: in der Variablendeklaration und Wertzuweisung: Eissorte meineis = Eissorte.Himbeere; Bei der Ausgabe: System.out.println("Mein Eis Eis hat hat den den Geschmack " + meineis); Konsole Mein Eis hat den Geschmack Himbeere 12/16
Java enum - Verwendung Enum in Switch-Anweisung: Enum-Werte können als Case-Labels verwendet werden. Java ersetzt sie intern durch ihre Ordinalwerte: switch switch ( meineis meineis ) { case case Himbeere: System.out.println("lecker!"); break; break; case case Vanille: System.out.println("Geschmackssache"); break; break; case case Schoko: Schoko: System.out.println("Wem's schmeckt.."); break; break; case case Pistazie: System.out.println("Schmeckt nussig!"); break; break; default: default: System.out.println("Gibt's eine eine neue neue Sorte?"); break; break; } 13/16
Java enum - Erweiterung Für Enums können Instanzvariablen und eigene Konstruktoren definiert werden: public enum Eissorte { Himbeere(80), Vanille(90), Schoko(120), Pistazie(75); } private int kalorien; private Eissorte(int kalorien) { this.kalorien = kalorien; } Beachte: Selbst wenn der Konstruktor als public deklariert wird, können keine zusätzlichen Instanzen erzeugt werden! 14/16
Java enum - Erweiterung Für Enums können Instanzmethoden definiert werden: public enum Eissorte { Himbeere(80), Vanille(90), Schoko(120), Pistazie(75); private int kalorien; private Eissorte(int kalorien) { this.kalorien = kalorien; } } public getkalorien() { return kalorien; } 15/16
Java enum - Erweiterung Verwendung: Eissorte meineis = Eissorte.Himbeere; System.out.println("Mein Eis Eis hat hat den den Geschmack " + meineis + " und " + meineis.getkalorien() + " Kalorien."); Konsole Mein Eis hat den Geschmack Himbeere und 80 Kalorien. 16/16