5.3Getters et setters
5.3.1 – Rôle
Les getters et setters sont des méthodes publiques qui permettent de contrôler l'accès aux attributs privés. Ils sont essentiels pour implémenter l'encapsulation en Java.
🔍 Getters (Accesseurs)
Un getter (accesseur) est une méthode qui retourne la valeur d'un attribut privé. Il permet de lire la valeur sans accès direct à l'attribut.
Structure d'un getter :
public class Personne {
private String nom;
private int age;
// Getter pour 'nom'
public String getNom() {
return nom;
}
// Getter pour 'age'
public int getAge() {
return age;
}
}
✏️ Setters (Mutateurs)
Un setter (mutateur) est une méthode qui modifie la valeur d'un attribut privé. Il permet de contrôler et valider les valeurs avant de les assigner.
Structure d'un setter :
public class Personne {
private String nom;
private int age;
// Setter pour 'nom'
public void setNom(String nom) {
this.nom = nom;
}
// Setter pour 'age'
public void setAge(int age) {
this.age = age;
}
}
đź“‹ Conventions de nommage
En Java, les getters et setters suivent des conventions strictes :
- Getter :
get+ nom de l'attribut (première lettre en majuscule) - Setter :
set+ nom de l'attribut (première lettre en majuscule) - Pour les booléens, on peut utiliser
isau lieu deget
Exemples de conventions :
public class Personne {
private String nom;
private int age;
private boolean actif;
// Getters
public String getNom() { return nom; }
public int getAge() { return age; }
public boolean isActif() { return actif; } // 'is' pour booléen
// Setters
public void setNom(String nom) { this.nom = nom; }
public void setAge(int age) { this.age = age; }
public void setActif(boolean actif) { this.actif = actif; }
}
âś… Avantages des getters et setters
- Contrôle d'accès : Vous contrôlez comment les attributs sont lus et modifiés
- Validation : Vous pouvez valider les valeurs avant de les assigner
- Flexibilité : Vous pouvez changer l'implémentation interne sans affecter le code client
- Logique supplémentaire : Vous pouvez ajouter du code (logs, notifications, etc.) lors de l'accès
5.3.2 – Utilisation
Les getters et setters s'utilisent pour accéder et modifier les attributs privés depuis l'extérieur de la classe.
📝 Utilisation de base
Exemple simple :
public class Personne {
private String nom;
private int age;
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// Utilisation
Personne p = new Personne();
p.setNom("Jean"); // Utiliser le setter
p.setAge(25);
String nom = p.getNom(); // Utiliser le getter
int age = p.getAge();
🛡️ Validation dans les setters
Un des avantages des setters est de pouvoir valider les valeurs avant de les assigner :
Exemple : Setter avec validation
public class Personne {
private int age;
public void setAge(int age) {
// Validation : l'âge doit être positif
if (age < 0) {
System.out.println("Erreur : l'âge ne peut pas être négatif");
return; // Ne modifie pas la valeur
}
// Validation : l'âge doit être raisonnable
if (age > 150) {
System.out.println("Erreur : l'âge semble invalide");
return;
}
this.age = age; // Assignation seulement si valide
}
public int getAge() {
return age;
}
}
📊 Exemple complet : Classe avec getters et setters
Exemple complet :
public class Personne {
// Attributs privés
private String nom;
private int age;
private String email;
// Constructeur
public Personne(String nom, int age) {
this.nom = nom;
this.age = age;
}
// Getters
public String getNom() {
return nom;
}
public int getAge() {
return age;
}
public String getEmail() {
return email;
}
// Setters
public void setNom(String nom) {
if (nom != null && !nom.trim().isEmpty()) {
this.nom = nom;
}
}
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
}
}
public void setEmail(String email) {
if (email != null && email.contains("@")) {
this.email = email;
}
}
}
đź”’ Getters sans setters (lecture seule)
Parfois, vous voulez permettre la lecture mais pas la modification. Dans ce cas, créez seulement un getter :
Exemple : Attribut en lecture seule
public class Personne {
private String nom;
private final int id; // ID ne peut pas être modifié
public Personne(String nom, int id) {
this.nom = nom;
this.id = id; // Initialisé une seule fois
}
// Getter : lecture autorisée
public int getId() {
return id;
}
// Pas de setter : modification interdite
// public void setId(int id) { ... } // ❌ Ne pas créer
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
}
📊 Tableau de comparaison : Accès direct vs Getters/Setters
| Critère | Accès direct (public) | Getters/Setters (private) |
|---|---|---|
| Encapsulation | ❌ Aucune | ✅ Contrôle total |
| Validation | ❌ Impossible | ✅ Possible dans les setters |
| Flexibilité | ❌ Code client dépendant | ✅ Implémentation changeable |
| Lecture seule | ❌ Impossible | ✅ Getter sans setter |
| Logique supplémentaire | ❌ Impossible | ✅ Logs, notifications, etc. |
💡 Points clés à retenir
- Getter : Méthode qui retourne la valeur d'un attribut privé
- Setter : Méthode qui modifie la valeur d'un attribut privé
- Convention :
getXxx()pour les getters,setXxx()pour les setters - Booléens : Utiliser
isXxx()pour les getters de booléens - Validation : Ajouter la validation dans les setters
- Lecture seule : Créer seulement un getter si l'attribut ne doit pas être modifié
- Encapsulation : Les getters/setters permettent de contrôler l'accès aux données
- Toujours rendre les attributs
privateet utiliser des getters/setters - Ajouter de la validation dans les setters pour garantir l'intégrité des données
- Utiliser des getters/setters même si la logique est simple (flexibilité future)
- Pour les attributs immuables, créer seulement un getter