Java kennt mehrere Arten von Initialisierern an Klassen. Dazu gehört vor allem der bekannte Konstruktor. Ebenso aber auch der statische Initialisierer und der Instant-Initialisierer.
public class Foo { public Foo() { System.out.println("constructor called"); } static { System.out.println("static initializer called"); } { System.out.println("instance initializer called"); } } |
Instanziiert man die Klasse Foo nun zweimal via:
new Foo(); new Foo(); |
So erzeugt dies die folgende Ausgabe:
static initializer called instance initializer called constructor called instance initializer called constructor called |
Das praktische daran? Man kann automatisch Felder initialisieren lassen, auch final-Felder können über diese Art des Zugriffs gesetzt werden. Fügt man also zum Beispiel zu einem späteren Zeipunkt einen weiteren Konstruktor hinzu, kann das initialisieren der Felder nicht mehr vergessen werden, sofern es in den Instance Initializer ausgelagert wurde. Der Code wird somit auch leichter lesbar.