Es sind Blöcke der Art static { … } im Rumpf eines Aufzählungstyps erlaubt. Lädt die Laufzeitumgebung einer Klasse, initialisiert sie der Reihe nach alle statischen Variablen bzw. führt die static-Blöcke aus. Die Aufzählungen sind statische Variablen und werden beim Laden initialisiert. Steht der statische Initialisierer hinter den Konstanten, so wird auch er später aufgerufen als die Konstuktoren, die vielleicht auf statische Variablen zurückgreifen wollen, die der static-Block initialisiert. Ein Beispiel:
public enum Country {
GERMANY, UK, CHINA;
{
System.out.println( "Objektinitialisierer" );
}
static {
System.out.println( "Klasseninitialisier" );
}
private Country() {
System.out.println( "Konstruktor" );
}
public static void main( String[] args ) {
System.out.println( GERMANY );
}
}
Die Ausgabe ist:
Objektinitialisierer
Konstruktor
Objektinitialisierer
Konstruktor
Objektinitialisierer
Konstruktor
Klasseninitialisier
GERMANY
Die Ausführung und Ausgabe hängt von der Reihenfolge der Deklaration ab und jede Umsortierung führt zu einer Verhaltensänderung. Jetzt könnten Programmierer auf die Idee kommen, mögliche static-Blöcke an den Anfang zu setzen, vor die Konstanten. Meine Leser sollten das Ergebnis testen …