Historique de la question :
En Java, le concept d'appel d'un constructeur à partir d'un autre (constructor chaining) est apparu comme une nécessité pour gérer plus efficacement l'initialisation des objets, en évitant la duplication de code. Cela permet de lier les constructeurs au sein d'une même classe ou en chaîne à travers la hiérarchie d'héritage.
Problème :
Lors de la conception de classes complexes avec de nombreux paramètres, il est inconfortable et inefficace de copier la logique d'initialisation dans chaque constructeur. Cela entraîne une duplication de code, des erreurs et réduit la maintenabilité du système.
Solution :
En Java, on peut appeler un constructeur depuis un autre à l'aide du mot-clé this() pour le constructeur de la même classe, et super() pour le constructeur de la classe parent. Cela permet de centraliser la logique d'initialisation, d'améliorer la lisibilité et de réduire les risques d'erreurs.
Exemple de code :
public class Person { private String name; private int age; public Person(String name) { this(name, 0); // appel d'un autre constructeur } public Person(String name, int age) { this.name = name; this.age = age; } }
Caractéristiques clés :
this() doit être la première ligne dans le constructeur.super().Peut-on appeler un constructeur autre que la première ligne du constructeur ?
Non. L'appel this() ou super() doit toujours être la première ligne du constructeur, sinon le code ne se compilera pas.
Que se passera-t-il si l'on n'appelle pas explicitement super() dans le constructeur de l'héritier ?
Dans ce cas, Java ajoute automatiquement un appel au constructeur par défaut sans argument de la classe parent. S'il n'y a pas de tel constructeur, le programme ne se compilera pas.
Exemple de code :
class Base { public Base(int x) {} } class Derived extends Base { public Derived() {} // Erreur ! Pas de constructeur Base() sans paramètres }
Combien de fois peut-on appeler this() dans un constructeur ?
Une seule fois et uniquement comme première ligne. Un appel répété ou non premier provoquera une erreur de compilation.
this() pas en première ligne.Un programmeur copie la même initialisation dans chaque constructeur de la classe — lors de la modification de la logique, il ne faut pas oublier de changer tous les constructeurs.
Avantages :
Inconvénients :
Un programmeur utilise le constructeur avec le plus grand nombre de paramètres comme principal, et les autres lui délèguent via this() — la logique est centralisée.
Avantages :
Inconvénients :