Un inizializzatore statico in Java è un blocco di codice racchiuso tra parentesi graffe e preceduto dalla parola chiave static. Questo blocco viene eseguito una sola volta al caricamento della classe nella JVM, prima della creazione di qualsiasi istanza di questa classe e prima della chiamata di qualsiasi metodo statico. Il suo compito principale è quello di svolgere una complessa inizializzazione delle variabili statiche.
public class Example { static int staticValue; static { staticValue = 10; // Logica complessa di inizializzazione System.out.println("Blocco statico di inizializzazione eseguito"); } }
L'inizializzatore statico è particolarmente utile quando una variabile statica dipende da altre risorse o richiede elaborazione al caricamento della classe.
Domanda: "In che ordine vengono eseguiti i blocchi statici e l'inizializzazione delle variabili statiche in Java, se l'ordine della loro dichiarazione varia nella classe?"
Risposta corretta: Tutte le variabili statiche e i blocchi vengono inizializzati nell'ordine in cui sono dichiarati nel codice sorgente della classe (dall'alto verso il basso). Se una variabile statica viene utilizzata in un blocco statico che si trova sopra la sua definizione, ciò genererà un errore di compilazione o può portare a un valore inaspettato.
class Order { static { System.out.println(X); // valore predefinito: 0 } static int X = 100; static { System.out.println(X); // 100 } }
Storia
In un grande progetto, il logger è stato inizializzato tramite un blocco statico, ma spostando la dichiarazione delle variabili e dei blocchi statici, la variabile del logger è rimasta non inizializzata al momento della chiamata, causando un NullPointerException durante il logging durante il caricamento della classe.
Storia
Durante lo sviluppo di un'utilità JDBC, l'inizializzazione dei driver veniva eseguita in un blocco statico. Uno degli sviluppatori ha spostato la dichiarazione di una variabile String che contiene il percorso, sotto il blocco statico, e il codice ha smesso di collegarsi correttamente al DB — il percorso era null.
Storia
In un sistema distribuito si sono verificati problemi con il caricamento dei dati di configurazione: parte della logica è stata realizzata attraverso blocchi statici in diverse classi con riferimenti reciproci, il che ha portato a inizializzazioni cicliche e StackOverflowError durante l'avvio dell'applicazione, a causa di una scorretta organizzazione dei blocchi statici e delle dipendenze.