Bonjour ! Dans la leçon précédente, nous avons maîtrisé l'encapsulation, un principe clé de la POO, en protégeant nos attributs avec le modificateur private et en contrôlant leur accès via des getters et setters publics. Vous avez peut-être remarqué que dans nos exemples, nous écrivions des lignes comme this.nom = nom;.
Aujourd'hui, nous allons nous concentrer sur ce mot-clé this pour bien comprendre son rôle crucial. L'objectif est d'apprendre à l'utiliser pour résoudre un problème très courant en programmation orientée objet : l'ambiguïté qui survient lorsque les paramètres d'une méthode portent le même nom que les attributs de la classe. C'est une compétence essentielle pour écrire un code Java propre et lisible.
1. Le problème de l'ambiguïté des noms
En Java, il est très courant et même recommandé de nommer les paramètres d'un constructeur ou d'un setter de la même manière que les attributs qu'ils sont censés initialiser. Par exemple :
public class Produit {
private String nom;
private double prix;
// Constructeur avec des paramètres qui ont le même nom que les attributs
public Produit(String nom, double prix) {
// Comment Java peut-il savoir quel 'nom' est l'attribut et quel 'nom' est le paramètre ?
nom = nom; // ???
prix = prix; // ???
}
public void afficher() {
System.out.println("Produit : " + nom + ", Prix : " + prix);
}
}
// Utilisation
Produit monProduit = new Produit("Laptop", 999.99);
monProduit.afficher(); // Affiche -> Produit : null, Prix : 0.0
Pourquoi ce résultat ? Lorsqu'un paramètre ou une variable locale a le même nom qu'un attribut d'instance, il le "masque" (on parle de shadowing). Dans l'instruction nom = nom;, Java interprète les deux nom comme étant le paramètre de la méthode. Vous assignez donc la valeur du paramètre... à lui-même. L'attribut nom de l'objet, lui, n'est jamais modifié et conserve sa valeur par défaut (null pour un String, 0.0 pour un double).
La vidéo suivante illustre parfaitement ce problème et la première idée (pas idéale) que l'on pourrait avoir pour le contourner.
JAVA (Intermédiaire) - 9 - A quoi sert this en java?
Regardez le début de la vidéo "A quoi sert this en java?" de la chaîne LES TEACHERS DU NET.
Observez d'abord la présentation du problème d'ambiguïté lorsque le paramètre et l'attribut ont le même nom. Ensuite, regardez la solution temporaire proposée, qui consiste à changer le nom du paramètre. Notez que cela fonctionne, mais rend le code moins intuitif.
Changer le nom des paramètres (titre au lieu de title) fonctionne, mais cela oblige à trouver des noms différents et peut nuire à la lisibilité. Heureusement, Java offre une solution bien plus élégante : le mot-clé this.
2. La solution : le mot-clé this
Le mot-clé this est une référence à l'instance courante de l'objet. C'est une façon pour un objet de se "désigner lui-même" depuis l'intérieur de ses propres méthodes.
En l'utilisant, on peut lever toute ambiguïté :
this.nomfait explicitement référence à l'attributnomde l'objet courant.nom(sansthis) fait référence au paramètre ou à la variable locale la plus proche.
Reprenons notre classe Produit et corrigeons-la :
public class Produit {
private String nom;
private double prix;
public Produit(String nom, double prix) {
// 'this.nom' est l'attribut de l'objet. 'nom' est le paramètre de la méthode.
this.nom = nom;
// 'this.prix' est l'attribut. 'prix' est le paramètre.
this.prix = prix;
}
public void setPrix(double prix) {
if (prix > 0) {
this.prix = prix; // 'this' est aussi nécessaire ici !
}
}
// Dans un getter, 'this' est souvent optionnel car il n'y a pas d'ambiguïté.
public double getPrix() {
return this.prix; // ou simplement "return prix;"
}
public void afficher() {
System.out.println("Produit : " + this.nom + ", Prix : " + this.prix);
}
}
// Utilisation
Produit monProduit = new Produit("Laptop", 999.99);
monProduit.afficher(); // Affiche -> Produit : Laptop, Prix : 999.99
Cette fois, le code fonctionne comme prévu ! L'utilisation de this a permis d'assigner correctement les valeurs des paramètres aux attributs de l'objet.

La lecture suivante détaille ce mécanisme avec des exemples clairs, en montrant le code qui pose problème et comment this le résout.
Les bases de la POO en Java : Classes, Objets, Encapsulation et this
Lisez cette section de l'article "Les bases de la POO en Java" de Rachid Saad. Elle se concentre sur l'utilisation de this pour résoudre les ambiguïtés.
Concentrez-vous sur la sous-section "Résoudre l'ambiguïté entre attribut et paramètre". Comparez bien les exemples PersonneSansThis (qui ne fonctionne pas) et PersonneAvecThis (la solution correcte). L'article présente également les erreurs courantes et les bonnes pratiques associées.
Pour renforcer votre compréhension, la vidéo suivante vous explique de manière très claire ce que this représente et comment Java l'utilise pour savoir à quel objet les modifications s'appliquent.
JAVA (Intermédiaire) - 9 - A quoi sert this en java?
Retournons à la vidéo "A quoi sert this en java?".
Regardez comment le mot-clé 'this' est introduit pour résoudre le problème. Suivez attentivement l'explication de 'this' comme référence à l'objet courant. Le présentateur illustre bien comment this change de référence selon que l'on crée tache1 ou tache2. Enfin, la conclusion résume la bonne pratique qui consiste à utiliser des noms de paramètres explicites avec this.
3. Exercice pratique : Refactoriser la classe Client
Mettons maintenant cela en pratique en reprenant l'exercice de la leçon précédente.
Énoncé :
-
Reprenez votre classe
Clientencapsulée de la leçon précédente. Si vous ne l'avez pas sous la main, voici un point de départ :public class Client { private long id; private String nom; private String prenom; private String email; public Client(long idClient, String nomClient, String prenomClient, String emailClient) { this.id = idClient; this.nom = nomClient; this.prenom = prenomClient; this.email = emailClient; } // Getters et Setters... public void setNom(String nomClient) { // validation... this.nom = nomClient; } // ... autres setters } -
Refactorisez le constructeur et tous les setters (
setNom,setPrenom,setEmail). Modifiez les noms des paramètres pour qu'ils soient identiques aux noms des attributs. Par exemple,setNom(String nomClient)devientsetNom(String nom). -
Utilisez le mot-clé
thispour que les assignations fonctionnent correctement et résolvent les ambiguïtés.
Votre code devrait ressembler à ceci à la fin :
public class Client {
private long id;
private String nom;
private String prenom;
private String email;
// Constructeur refactorisé
public Client(long id, String nom, String prenom, String email) {
// ... à compléter avec 'this'
}
// Setter refactorisé
public void setNom(String nom) {
if (nom == null || nom.trim().isEmpty()) {
throw new IllegalArgumentException("Le nom ne peut être null ou vide.");
}
// ... à compléter avec 'this'
}
// ... autres setters à refactoriser
}
Cliquez ici pour voir la solution
public class Client {
private long id;
private String nom;
private String prenom;
private String email;
// Constructeur refactorisé avec des noms de paramètres identiques aux attributs
public Client(long id, String nom, String prenom, String email) {
this.id = id;
this.setNom(nom); // On peut toujours utiliser les setters pour la validation
this.setPrenom(prenom);
this.setEmail(email);
}
// --- GETTERS (inchangés) ---
public long getId() { return id; }
public String getNom() { return nom; }
public String getPrenom() { return prenom; }
public String getEmail() { return email; }
// --- SETTERS refactorisés ---
public void setNom(String nom) {
if (nom == null || nom.trim().isEmpty()) {
throw new IllegalArgumentException("Le nom ne peut être null ou vide.");
}
this.nom = nom; // 'this' est indispensable ici
}
public void setPrenom(String prenom) {
if (prenom == null || prenom.trim().isEmpty()) {
throw new IllegalArgumentException("Le prénom ne peut être null ou vide.");
}
this.prenom = prenom; // 'this' est indispensable ici
}
public void setEmail(String email) {
if (email == null || !email.contains("@")) {
throw new IllegalArgumentException("L'email est invalide.");
}
this.email = email; // 'this' est indispensable ici
}
@Override
public String toString() {
return "Client [id=" + id + ", nom=" + nom + ", prenom=" + prenom + ", email=" + email + "]";
}
}
// Classe de test (inchangée, elle doit continuer à fonctionner)
public class Main {
public static void main(String[] args) {
Client client1 = new Client(1L, "Dupont", "Jean", "jean.dupont@email.com");
System.out.println("Client créé : " + client1);
client1.setNom("Durand");
System.out.println("Nom mis à jour : " + client1.getNom());
}
}
Conclusion
Vous savez maintenant manier le mot-clé this avec précision. C'est une petite syntaxe qui a un impact majeur sur la clarté et la robustesse du code orienté objet.
À retenir :
- Le mot-clé
thisest une référence à l'objet courant depuis l'une de ses méthodes. - Il est essentiel pour différencier un attribut d'instance d'un paramètre de méthode lorsque ceux-ci ont le même nom. C'est ce qu'on appelle résoudre le problème de shadowing (masquage).
- La convention en Java est d'utiliser les mêmes noms pour les paramètres des constructeurs/setters et les attributs qu'ils initialisent, puis d'utiliser
thispour faire la distinction.
Dans notre prochaine leçon, nous allons découvrir une autre facette de la POO : les membres static. Nous verrons comment définir des attributs et des méthodes qui appartiennent à la classe elle-même, et non à une instance particulière. Cela nous permettra de comprendre la différence fondamentale entre le contexte d'une instance (où this existe) et le contexte d'une classe (où this n'a pas de sens).