Aufzählungstyp
Ein Aufzählungstyp (englisch enumerated type) ist ein Datentyp für Variablen mit einer endlichen Wertemenge. Alle zulässigen Werte des Aufzählungstyps werden bei der Deklaration des Datentyps mit einem eindeutigen Namen (Identifikator) definiert, sie sind Symbole. Dabei kann auch eine Reihenfolge festgelegt werden, die eine Ordnung der einzelnen Werte bestimmt, nach der dann sortiert werden kann.
Bei Aufzählungstypen kann mitunter auch der textuelle Name eines Symbols direkt Verwendung finden, gewissermaßen als festgelegte Zeichenkette.
Unterstützende Sprachen
Aufzählungstypen sind zum Beispiel in den Programmiersprachen Pascal, Modula-2, Modula-3, Ada, Haskell, C, C++, C# und VB.Net üblich. In Java werden Aufzählungen erst ab der Version 5 unterstützt, dafür sind sie hier als echte Objekte mit objektorientierten Mitteln erweiterbar.
Typsicherheit
Man unterscheidet typenlose Aufzählungen wie in C, die lediglich Namen für numerische Werte festlegen (im Allgemeinen Ganzzahlen), und typsichere Aufzählungen wie in Pascal und Java. Typsichere Aufzählungstypen verhindern, dass Werte aus unterschiedlichen Aufzählungstypen verglichen oder zugewiesen werden können. So wäre beispielsweise die Farbe BLAU
aus dem unten stehenden Beispiel ein anderer Wert als das erste Element eines anderen Aufzählungstypen (zum Beispiel APFEL
der Aufzählung Obst
). Eine Variable vom Typ Farbe
ist nicht zuweisungskompatibel mit einem Wert vom Typ Obst
. Dies bringt den Vorteil, dass der Compiler keine fehlerhaften Zuweisungen zulässt.
Beispiele
Der einfachste und häufigste Aufzählungstyp mit exakt zwei gültigen Werten ist der logische Datentyp Boolean:
Aufzählungstyp boolean ist {false, true};
Ein Beispiel für einen Aufzählungstyp, der Farben repräsentiert:
Aufzählungstyp Farbe ist {BLAU, GRUEN, ROT, GELB};
Ein Beispiel für einen Aufzählungstyp, der Obst repräsentiert:
Aufzählungstyp Obst ist {APFEL, KIRSCHE, PFLAUME};
Dies ermöglicht die folgende Zuweisung, in welcher der Variablen tapetenfarbe
vom Typ Farbe
der Wert BLAU
zugewiesen wird:
Variable tapetenfarbe ist vom Datentyp Farbe; setze tapetenfarbe auf BLAU;
In einer typensicheren Programmiersprache würde Folgendes einen Fehler erzeugen:
setze tapetenfarbe auf VIOLETT; //Fehler: kein vereinbartes Symbol (in Typ Farbe) setze tapetenfarbe auf APFEL; //Fehler: APFEL ist nicht zuweisungskompatibel zum Datentyp Farbe!
Bei typenlosen Aufzählungen (wie in der Sprache C) ist möglich:
setze tapetenfarbe auf APFEL; //kein Fehler! Weil APFEL ebenso für eine Ganzzahl steht wie z. B. GELB.
In einigen Sprachen lässt sich den Werten eine ganze Zahl zuweisen, statt die Zuteilung dem Compiler zu überlassen, um einfacher zwischen Werten und ganzen Zahlen zu konvertieren oder eine Bitmenge zu ermöglichen (siehe unten). Wird die Zahl bei einem späteren Element nicht vorgegeben, zählt der Compiler von der letzten ihm bekannten Zahl weiter:
Aufzählungstyp Farbe ist {BLAU = 1, GRUEN, ROT = 4, GELB = 8}; // GRUEN erhält implizit den Wert 2
Zudem kann teils für einen Aufzählungstyp ein zugehöriger Mengentyp (englisch set) deklariert werden. Für diesen stehen dann Vergleiche und Mengenoperatoren zur Verfügung.
definiere Typ 'Farben' als Mengentyp über Farbe; // Menge über dem Aufzählungstyp 'Farbe' Variable warmeFarben ist vom Datentyp Farben; nehme in warmeFarben auf (ROT, GELB); falls ROT in warmeFarben dann gib aus 'Rot ist eine warme Farbe';
Falls in Sprachen mit typenlosen Aufzählungen solche Mengentypen nicht als eigenes Sprachelement unterstützt werden, ist die Nutzung von Bitmustern üblich. Dazu werden den Werten Zweierpotenzen als Zahlenwert zugewiesen und Mengenoperatoren mittels bitweiser Operatoren umgesetzt:
Variable warmeFarben ist vom Datentyp integer; setze warmeFarben auf ROT ODER GELB; // warmeFarben ist jetzt 12, denn 4 ODER 8 = 12 falls (warmeFarben UND ROT) != 0 dann // 12 UND 8 ist 8 und somit nicht 0 (in einigen Sprachen ist zur Vereinfachung solcher Ausdrücke die Zahl 0 implizit 'falsch' und jede andere ganze Zahl implizit 'wahr') gib 'ROT ist eine warme Farbe' aus;
Weblinks
- Dean Roddey: Stupid Enumeration Tricks