Un bloc d'initialisation statique est un bloc de code qui s'exécute lors du chargement initial d'une classe par la JVM avant la première utilisation de tout membre statique ou la création d'une instance de la classe.
Historique de la question :
Java a toujours fourni des champs statiques pour stocker des valeurs communes à toutes les instances. Pour une initialisation non standard ou des calculs complexes au démarrage de la classe, des blocs static ont été introduits.
Problème :
Les champs statiques ordinaires peuvent être initialisés directement lors de leur déclaration, mais lorsque l'initialisation est longue, nécessite des appels à d'autres classes/fichiers/Bases de données, ou dépend d'une logique complexe, il est nécessaire d'utiliser des blocs static. Une mauvaise utilisation des blocs static peut entraîner un comportement inattendu lors du chargement des classes, des difficultés lors des tests, et même des deadlocks.
Solution :
Les blocs static ne doivent être utilisés que pour l'initialisation complexe des ressources statiques, lorsque cela ne peut pas être exprimé par une seule expression. Un bon exemple est le chargement de pilotes JDBC, la lecture de fichiers de configuration :
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); } } }
Caractéristiques clés :
Peut-on utiliser return à l'intérieur d'un bloc statique ?
Non, l'opérateur return n'est pas autorisé dans les blocs static. On peut utiliser throw pour lancer une exception.
Quand le bloc statique s'exécute-t-il — lors du chargement de la classe ou lors de la création de l'objet ?
Le bloc statique s'exécute une fois lors du chargement de la classe, même si aucun objet n'est jamais créé.
Peut-on avoir plusieurs blocs static dans une classe ? Dans quel ordre sont-ils exécutés ?
Oui, on peut déclarer plusieurs blocs statiques. Ils s'exécutent dans l'ordre où ils apparaissent dans le code des classes.
Dans un bloc static de la classe, un gros fichier est lu et une connexion est établie avec un service externe. Dans les tests ou de simples utilitaires, la classe JVM se charge lentement.
Avantages :
Inconvénients :
Le bloc static vérifie la présence d'une licence logicielle au démarrage, lance une ExceptionInInitializerError en cas d'erreur.
Avantages :
Inconvénients :