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 Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 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. Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 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 Eissorte meinEis; meinEis; ● Werte an diese Variablen zuweisen: meinEis meinEis == Himbeere; Himbeere; Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 4/16 Was sind Aufzählungstypen? ● Aufzähltypen in Switch-Anweisungen verwenden: switch switch (( meinEis meinEis )) {{ case case Himbeere: Himbeere: System.out.println("Himbeere"); System.out.println("Himbeere"); break; break; case case Vanille: Vanille: System.out.println("Vanille"); System.out.println("Vanille"); break; break; …… }} Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 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 Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 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! Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 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“) Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 8/16 Java enum ● Java unterstützt ab Version 5 Aufzähltypen als spezielle Klassen: Syntaxregel public enum <EnumName> { <Wert1>, <Wert2>, …, <Wertn>; } ● Beispiel: public public enum enum Himbeere, Himbeere, }} Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH Eissorte Eissorte Vanille, Vanille, {{ Schoko, Schoko, Pistazie; 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 Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 10/16 Java enum ● Jede enum-Klasse MeineAufzaehlung enthält eine Klassenmethode values(), die ein Feld zurückliefert, das alle Werte enthält: public public static static MeineAufzaehlung[] MeineAufzaehlung[] values(); values(); ● Verwendung: Was ergibt der folgende Ausdruck? Eissorte Eissorte lieblingsSorte lieblingsSorte == Eissorte.values() Eissorte.values() [Eissorte.Vanille.ordinal()]; [Eissorte.Vanille.ordinal()]; Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 11/16 Java enum - Verwendung ● ● Verwendung: in der Variablendeklaration und Wertzuweisung: Eissorte Eissorte meinEis meinEis == Eissorte.Himbeere; Eissorte.Himbeere; ● Bei der Ausgabe: System.out.println("Mein System.out.println("Mein Eis Eis hat hat den den Geschmack Geschmack "" ++ meinEis); meinEis); Konsole Mein Eis hat den Geschmack Himbeere Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 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: Himbeere: System.out.println("lecker!"); System.out.println("lecker!"); break; break; case case Vanille: Vanille: System.out.println("Geschmackssache"); System.out.println("Geschmackssache"); break; break; case Schoko: case Schoko: System.out.println("Wem's System.out.println("Wem's schmeckt.."); schmeckt.."); break; break; case case Pistazie: Pistazie: System.out.println("Schmeckt System.out.println("Schmeckt nussig!"); nussig!"); break; break; default: default: System.out.println("Gibt's System.out.println("Gibt's eine eine neue neue Sorte?"); Sorte?"); break; break; }} Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 13/16 Java enum - Erweiterung ● Für Enums können Instanzvariablen und eigene Konstruktoren definiert werden: public public enum enum Eissorte Eissorte {{ Himbeere(80), Himbeere(80), Vanille(90), Vanille(90), Schoko(120), Schoko(120), Pistazie(75); Pistazie(75); }} ● private private int int kalorien; kalorien; private private Eissorte(int Eissorte(int kalorien) kalorien) {{ this.kalorien this.kalorien == kalorien; kalorien; }} Beachte: Selbst wenn der Konstruktor als public deklariert wird, können keine zusätzlichen Instanzen erzeugt werden! Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 14/16 Java enum - Erweiterung ● Für Enums können Instanzmethoden definiert werden: public public enum enum Eissorte Eissorte {{ Himbeere(80), Himbeere(80), Vanille(90), Vanille(90), Schoko(120), Schoko(120), Pistazie(75); Pistazie(75); private private int int kalorien; kalorien; private private Eissorte(int Eissorte(int kalorien) kalorien) {{ this.kalorien this.kalorien == kalorien; kalorien; }} }} public public getKalorien() getKalorien() {{ return return kalorien; kalorien; }} Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 15/16 Java enum - Erweiterung ● Verwendung: Eissorte Eissorte meinEis meinEis == Eissorte.Himbeere; Eissorte.Himbeere; System.out.println("Mein System.out.println("Mein Eis Eis hat hat den den Geschmack Geschmack "" ++ meinEis meinEis ++ "" und und "" ++ meinEis.getKalorien() meinEis.getKalorien() ++ "" Kalorien."); Kalorien."); Konsole Mein Eis hat den Geschmack Himbeere und 80 Kalorien. Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 16/16