Die Syntax für Instanzinitialisierer ist ein spezieller Codeblock, der in geschweifte Klammern innerhalb einer Klasse, aber außerhalb von Methoden und Konstruktoren eingeschlossen ist. Ein solcher Block wird instance initializer block genannt. Er wird jedes Mal ausgeführt, wenn ein neues Objekt der Klasse erstellt wird, unmittelbar nach dem Aufruf des Konstruktors der Elternklasse und vor der Ausführung des Codes des Konstruktors der aktuellen Klasse.
public class Example { { // Instance initializer block System.out.println("Instanzinitialisierung"); } private int x; public Example(int x) { this.x = x; System.out.println("Konstruktor"); } }
Der Instanzinitialisierer ist nützlich für:
Was passiert, wenn eine Klasse sowohl einen Instanzinitialisierer als auch einen Konstruktor hat? In welcher Reihenfolge werden sie ausgeführt?
Antwort: Zuerst wird der Instanzinitialisierer ausgeführt, dann der Code des Konstruktors. Wenn in der Klasse mehrere Instanzinitialisierer vorhanden sind, werden sie in der Reihenfolge ausgeführt, in der sie geschrieben sind.
Beispiel:
public class Demo { { System.out.println("Instanzinitialisierer 1"); } public Demo() { System.out.println("Konstruktor"); } { System.out.println("Instanzinitialisierer 2"); } } // Ausgabe bei new Demo(): // Instanzinitialisierer 1 // Instanzinitialisierer 2 // Konstruktor
Geschichte
In einem Projekt platzierte ein Entwickler die Logik im Instanzinitialisierer anstelle einer Methode oder eines Konstruktors. Beim Vererben der Klasse und Überschreiben des Konstruktors wurde der Instanzinitialisierer trotzdem ausgeführt, was zu einer unerwarteten Reihenfolge der Initialisierung und Fehlern in der Geschäftslogik führte.
Geschichte
In einem anderen Projekt griff der Instanzinitialisierer auf Klasseneigenschaften zu, die weiter unten im Code initialisiert wurden. Es stellte sich heraus, dass die Variablen noch nicht initialisiert waren, und es trat ein NullPointerException bei der Erstellung des Objekts auf.
Geschichte
Das Team fügte im Instanzinitialisierer eine Operation hinzu, die mit externen Ressourcen (DB) verbunden war. Infolgedessen stellte jeder Aufruf des Konstruktors eine Verbindung zur DB her, was das System bei der batchweisen Erstellung von Objekten überlastete.