De syntaxis van instantie-initialisatie is een speciale codeblok, omgeven door accolades binnen een klasse, maar buiten methoden en constructeurs. Dit blok wordt een instance initializer block genoemd. Het wordt elke keer uitgevoerd wanneer een nieuw object van de klasse wordt gemaakt, direct na het aanroepen van de constructor van de bovenliggende klasse en vóór het uitvoeren van de code van de huidige klasse's constructor.
public class Example { { // Instance initializer block System.out.println("Instantie-initialisatie"); } private int x; public Example(int x) { this.x = x; System.out.println("Constructor"); } }
Een instance initializer is nuttig voor:
Wat gebeurt er als er zowel een instance initializer als een constructor in de klasse zijn? In welke volgorde worden ze uitgevoerd?
Antwoord: Eerst wordt de instance initializer uitgevoerd, daarna de code van de constructor. Als er meerdere instance initializer-blokken in de klasse zijn, worden ze uitgevoerd in de volgorde waarin ze zijn beschreven.
Voorbeeld:
public class Demo { { System.out.println("Instance initializer 1"); } public Demo() { System.out.println("Constructor"); } { System.out.println("Instance initializer 2"); } } // Output bij new Demo(): // Instance initializer 1 // Instance initializer 2 // Constructor
Verhaal
Op een project plaatste een ontwikkelaar de logica in de instance initializer in plaats van in een methode of constructor. Bij het afleiden van de klasse en het overschrijven van de constructor werd de instance initializer nog steeds uitgevoerd, wat leidde tot een onverwachte initialisatievolgorde en fouten in de bedrijfslogica.
Verhaal
Op een ander project verwees de instance initializer naar de klassevelden die lager in de code waren geïnitialiseerd. Blijkbaar waren de variabelen nog niet geïnitialiseerd, wat leidde tot een NullPointerException bij het creëren van een object.
Verhaal
Het team voegde een operatie in de instance initializer toe die verband hield met externe bronnen (DB). Hierdoor creëerde elke aanroep van de constructor een verbinding met de DB, wat het systeem overbelaste bij het batchgewijs creëren van objecten.