Programmiertechnik Aufzählungstypen

Werbung
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
Herunterladen