En Java, les blocs d'initialisation (init blocks) sont des blocs de code spéciaux qui s'exécutent lors de la création d'une instance d'un objet de classe, mais avant l'appel au constructeur. Il existe deux types :
public class Example { static { System.out.println("Bloc statique"); } { System.out.println("Bloc d'instance"); } public Example() { System.out.println("Constructeur"); } }
Lors de la création d'un nouvel objet, cela affichera :
Bloc statique
Bloc d'instance
Constructeur
Il est utile d'utiliser des blocs d'initialisation lorsque l'on nécessite une logique commune pour tous les constructeurs ou une initialisation complexe qui ne peut pas être réalisée dans la déclaration de variable. Cependant, on préfère souvent les constructeurs.
Question : Dans quel ordre s'initialisent les champs, les blocs statiques, les blocs d'instance et les constructeurs lors de la création d'un objet ?
Réponse :
Histoire
Dans un grand projet, un problème d'initialisation est apparu : un des développeurs a déplacé la logique commune du constructeur vers un bloc d'initialisation, sans tenir compte de l'ordre d'exécution. En conséquence, certains champs n'ont pas été correctement initialisés avant le démarrage de la logique, ce qui a provoqué un NullPointerException lors de la création de l'objet.
Histoire
La réutilisation d'un grand bloc d'initialisation dans une classe abstraite dont hérita d'autres classes a conduit les sous-classes à ne pas redéfinir correctement l'ordre d'initialisation. Cela a entraîné un comportement inattendu lors de l'héritage et des bugs liés à l'ordre d'appel des blocs d'initialisation et des constructeurs.
Histoire
Un développeur a supposé que les champs statiques pouvaient être réinitialisés à chaque nouvelle création d'objet, et a ajouté de la logique de nettoyage des ressources dans le bloc statique. Cela a conduit au fait que les ressources étaient nettoyées une seule fois lors du chargement de la classe, et toute gestion ultérieure de la mémoire "s'est effondrée". Puisque le bloc statique est appelé une seule fois, cela a conduit à des fuites et une gestion incorrecte des ressources.