Un blocco di inizializzazione statico è un blocco di codice eseguito durante il caricamento iniziale della classe da parte della JVM prima del primo utilizzo di qualsiasi membro statico o della creazione di un'istanza della classe.
Storia della questione:
Java ha sempre fornito campi statici per memorizzare valori condivisi tra tutte le istanze. Per un'inizializzazione non standard o calcoli complessi all'avvio della classe sono stati introdotti i blocchi statici.
Problema:
I normali campi statici possono essere inizializzati direttamente al momento della dichiarazione, ma quando l'inizializzazione è lunga, richiede accesso ad altre classi/file/DB o dipende da logica complessa, è necessario utilizzare blocchi statici. Un uso improprio dei blocchi statici può portare a comportamenti inaspettati durante il caricamento delle classi, difficoltà nella testabilità e persino a deadlock.
Soluzione:
I blocchi statici sono utilizzati solo per l'inizializzazione complessa delle risorse statiche, quando non possono essere espresse tramite un'unica espressione. Un buon esempio è il caricamento di driver JDBC, lettura di configurazioni:
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); } } }
Caratteristiche chiave:
È possibile utilizzare return all'interno di un blocco statico?
No, l'operatore return non è consentito nei blocchi statici. È possibile utilizzare throw per sollevare un'eccezione.
Quando viene eseguito un blocco statico — durante il caricamento della classe o durante la creazione di un oggetto?
Il blocco statico viene eseguito una sola volta durante il caricamento della classe, anche se non verrà creata alcuna istanza.
Possono esserci più blocchi statici in una classe? In che ordine vengono eseguiti?
Sì, è possibile dichiarare più blocchi statici. Vengono eseguiti nell'ordine in cui appaiono nel codice delle classi.
In una classe, un blocco statico legge un grande file e si connette a un servizio esterno. Nei test o in semplici utility, la classe JVM si carica lentamente.
Vantaggi:
Svantaggi:
Un blocco statico verifica la presenza di una licenza software all'avvio, sollevando ExceptionInInitializerError in caso di errore.
Vantaggi:
Svantaggi: