Een statisch initialisatieblok is een codeblok dat wordt uitgevoerd tijdens de eerste laadfase van de klasse in de JVM, vóór het eerste gebruik van een lid dat statisch is of het maken van een instantie van de klasse.
Geschiedenis van de kwestie:
Java heeft sinds het begin statische velden ter beschikking gesteld voor het opslaan van waarden die gemeenschappelijk zijn voor alle instanties. Voor niet-standaard initialisatie of complexe berekeningen bij het starten van een klasse zijn static-blokken geïntroduceerd.
Probleem:
Normale statische velden kunnen direct bij de declaratie worden geïnitialiseerd, maar wanneer de initialisatie langdurig is, toegang vereist tot andere klassen/bestanden/databases, of afhankelijk is van complexe logica, moet men gebruik maken van static-blokken. Onjuist gebruik van static-blokken kan leiden tot onverwacht gedrag bij het laden van klassen, moeilijkheden bij testen en zelfs tot deadlocks.
Oplossing:
Static-blokken worden alleen gebruikt voor complexe initialisatie van statische bronnen wanneer deze niet kunnen worden uitgedrukt in een enkele uitdrukking. Een goed voorbeeld is het laden van JDBC-drivers, het lezen van configuraties:
public class Config { public static Properties properties; static { properties = new Properties(); try (InputStream in = new FileInputStream("config.properties")) { properties.load(in); } catch (IOException e) { throw new ExceptionInInitializerError(e); } } }
Belangrijke kenmerken:
Kan je return gebruiken binnen een statisch blok?
Nee, de return-instructie is niet toegestaan in static-blokken. Je kunt throw gebruiken om een uitzondering te werpen.
Wanneer wordt het statische blok uitgevoerd - bij het laden van de klasse of bij het maken van een object?
Het statische blok wordt eenmaal uitgevoerd bij het laden van de klasse, zelfs als er geen objecten zijn gemaakt.
Kunnen er meerdere static-blokken in één klasse zijn? In welke volgorde worden ze uitgevoerd?
Ja, je kunt meerdere statische blokken declareren. Ze worden uitgevoerd in de volgorde waarin ze in de klassecode verschijnen.
In de klasse leest het static-blok een groot bestand en maakt het verbinding met een externe dienst. In testen of eenvoudige hulpprogramma's wordt de klasse in de JVM traag geladen.
Voordelen:
Nadelen:
Het static-blok controleert de aanwezigheid van softwarelicenties bij het opstarten en werpt een ExceptionInInitializerError bij een fout.
Voordelen:
Nadelen: