La syntaxe d'initialisation des champs d'instance est un bloc de code spécial, encadré par des accolades à l'intérieur de la classe, mais en dehors des méthodes et des constructeurs. Ce bloc est appelé instance initializer block. Il s'exécute chaque fois qu'un nouvel objet de la classe est créé, immédiatement après l'appel au constructeur de la classe parente et avant l'exécution du code du constructeur de la classe actuelle.
public class Example { { // Instance initializer block System.out.println("Initialisation de l'instance"); } private int x; public Example(int x) { this.x = x; System.out.println("Constructeur"); } }
L'instance initializer est utile pour :
Que se passe-t-il si une classe contient à la fois un instance initializer et un constructeur ? Dans quel ordre s'exécutent-ils ?
Réponse : D'abord, l'instance initializer s'exécute, puis le code du constructeur. Si la classe possède plusieurs blocs d'instance initializer, ils s'exécutent dans l'ordre où ils sont décrits.
Exemple :
public class Demo { { System.out.println("Instance initializer 1"); } public Demo() { System.out.println("Constructeur"); } { System.out.println("Instance initializer 2"); } } // Sortie lors de new Demo() : // Instance initializer 1 // Instance initializer 2 // Constructeur
Histoire
Dans un projet, un développeur a placé la logique dans un instance initializer au lieu d'une méthode ou d'un constructeur. Lors de l'héritage de la classe et du remplacement du constructeur, l'instance initializer s'est quand même exécuté, ce qui a conduit à un ordre d'initialisation inattendu et à des erreurs dans la logique métier.
Histoire
Dans un autre projet, l'instance initializer accédait aux champs de la classe qui étaient initialisés plus bas dans le code. Il s'est avéré que les variables n'étaient pas encore initialisées, ce qui a entraîné un NullPointerException lors de la création de l'objet.
Histoire
L'équipe a ajouté dans l'instance initializer une opération liée à des ressources externes (base de données). Par conséquent, chaque appel au constructeur se connectait à la base de données, ce qui a surchargé le système lors de la création en lot des objets.