Constructeurs et destructeurs
Rôle des constructeurs et destructeurs
En POO, un objet possède un cycle de vie :
- Allocation mémoire
- Construction (initialisation)
- Utilisation
- Destruction (libération des ressources)
Les constructeurs et destructeurs encadrent ce cycle.
Le constructeur
Définition
Un constructeur est une méthode spéciale :
- Appelée automatiquement lors de la création d'un objet
- Dont le rôle est d'initialiser l'état de l'objet
- Qui garantit que l'objet est valide dès sa naissance
Un objet ne devrait jamais exister dans un état incohérent.
Caractéristiques générales
| Propriété | Description |
|---|---|
| Nom | Identique à la classe (Java, C++) |
| Type de retour | Aucun |
| Appel | Implicite via new |
| Surcharge | Autorisée |
Exemple simple de constructeur
Constructeur par défaut
Définition
Un constructeur par défaut :
- Ne prend aucun paramètre
- Est généré automatiquement s'il n'y a aucun constructeur défini
Dès qu'un constructeur est défini, le constructeur par défaut n'est plus généré.
Constructeurs paramétrés
Ils permettent d'imposer :
- Des valeurs obligatoires
- Des règles métier dès la création
Surcharge de constructeurs
Plusieurs constructeurs dans une même classe.
Chaînage de constructeurs
Appel interne (this)
Appel du constructeur parent (super)
Le constructeur parent est toujours appelé en premier.
Constructeurs et héritage
- Les constructeurs ne sont pas hérités
- Mais ils sont toujours exécutés dans la hiérarchie
Ordre d'appel :
- Constructeur de la super-classe
- Constructeur de la sous-classe
Constructeurs et encapsulation
Le constructeur :
- Protège les invariants
- Remplace souvent les setters initiaux
Certains attributs peuvent devenir final.
Constructeurs et immuabilité
Un objet immuable :
- Tous les attributs sont définis dans le constructeur
- Aucun setter
Le destructeur
Définition
Un destructeur :
- Est appelé lors de la destruction de l'objet
- Sert à libérer les ressources
- Est crucial dans les langages sans Ramasse-miettes (Garbage Collection)
Destructeurs selon les langages
| Langage | Destruction |
|---|---|
| Java | finalize() (obsolète) |
| C# | Dispose() / finaliseur |
| C++ | ~Classe() |
| Free Pascal | destructor Destroy; |
| Delphi | destructor Destroy; override; |
Exemple de destructeur (C++)
Exemple en Free Pascal / Delphi
- Type
- TConnexion=Class
- Public
- Constructor Create;
- Destructor Destroy; override;
- End;
-
- Constructor TConnexion.Create;Begin
- Inherited Create;
- WriteLn('Connexion ouverte');
- End;
-
- Destructor TConnexion.Destroy;Begin
- WriteLn('Connexion fermée');
- Inherited Destroy;
- End;
Garbage Collector vs destruction explicite
Langages avec GC :
On libère les ressources logiques, pas la mémoire.
Langages sans GC :
Le développeur gère la durée de vie.
Constructeurs et exceptions
Un constructeur peut lever une exception :
- L'objet n'est pas créé
- Pas de fuite de ressources
- public Fichier(String chemin) throws IOException {}
Bonnes pratiques - constructeurs
- Initialiser tous les attributs obligatoires
- Valider les paramètres
- Limiter le nombre de constructeurs
- Favoriser les objets valides dès la création
Bonnes pratiques - destructeurs
- Libérer uniquement ce que l'objet possède
- Toujours appeler le destructeur parent
- Ne pas dépendre de l'ordre de destruction
- Éviter la logique métier complexe
Erreurs fréquentes
- Logique métier dans le destructeur
- Constructeurs trop complexes
- Oublier super() / inherited
- Ressources non libérées
UML - Constructeurs et destructeurs
- + Classe(param: Type)
- + ~Classe()
Lien avec SOLID
- S : constructeur = initialisation, pas logique métier
- O : extensions via sous-classes
- L : respect du contrat d'initialisation
- D : dépendances injectées via le constructeur
Conclusion
Les constructeurs et destructeurs sont les gardiens du cycle de vie des objets. Bien conçus, ils garantissent des objets valides, sûrs et sans fuite de ressources.
Un bon objet commence bien... et se termine proprement.