Enums

Ist ein Enum eine Klasse?

Bei „enum“ handelt es sich zunächst einmal um ein Schlüsselwort, das dazu dient, eine Typdefinition einzuleiten, so wie „class“ und „interface“. Aber ja, eine Enum ist eine spezielle Art von Klasse. Man kann - mit bestimmten Einschränkungen - eine Enum so deklarieren und implementieren, wie man eine Klasse deklariert, insbesondere muss eine solche Enum-Klasse auch keinesfalls eine innere Klasse einer anderen Klasse sein, auch wenn das in Beispielen oft so ist. Und letztlich baut der Compiler aus einer Enum eine normale Klasse mit einer ganz normalen Class-Datei. Aber es gibt auch eine Klasse Enum<E>, die die gemeinsame direkte Superklasse aller Aufzählungstypen bildet.

Kann ich über eine Enum iterieren, z.B. mit der ForEach-Form der For-Schleife?

Nein, nicht direkt. Aber jede Enum-Klasse verfügt implizit immer über die statische Methode values(). Diese liefert ein Array, welches alle „Werte“ des enum liefert. Und über dieses Array kann man dann ganz normal iterieren, auch mit der ForEach-Schleife.

Wo finde ich die Methoden values() und valueOf(String name) in der API-Doku?

Leider überhaupt nicht. Es handelt sich um implizit deklarierte statische Methoden, deren Vorhandensein für jede Enum-Klasse man schlicht kennen und akzeptieren muss… einer der unschönen Sonderfälle der Sprache Java.

In vielen Beispielen werden Enums innerhalb einer anderen Klasse definiert. Muss das so sein?

Nein, ganz im Gegenteil! In der Praxis wird man eine Enum so gut wie nie als innere Klasse modellieren wollen. Denn Enum-Typen sind normalerweise sehr "zentrale" Typen eines Programms: Man findet sie oft als Parameter oder Rückgabetypen von Methoden, über die verschiedene funktionale Untereinheiten eines Programms miteinander kommunizieren. Es wäre also ziemlich unsinnig, sie innerhalb einer anderen Klasse zu definieren. Dass man dies in Code-Beispielen trotzdem des öfteren findet, liegt nur daran, dass der jeweilige Autor sein Beispiel möglichst kompakt halten wollte.