↑
CHAPITRE 5.2

Encapsulation

Protéger les données et contrôler l'accès aux attributs
L'encapsulation est un principe fondamental de la POO qui consiste à cacher les détails d'implémentation et à protéger les données. Cette section explique le principe et les avantages de l'encapsulation.

5.2Encapsulation

5.2.1 – Principe

L'encapsulation est un principe fondamental de la programmation orientée objet qui consiste à cacher les détails d'implémentation et à protéger les données en rendant les attributs privés et en fournissant des méthodes publiques (getters/setters) pour y accéder.

đź”’ Concept de base

L'encapsulation repose sur deux principes :

  • Rendre les attributs privĂ©s : Les donnĂ©es internes ne sont pas directement accessibles depuis l'extĂ©rieur
  • Fournir des mĂ©thodes publiques : L'accès se fait uniquement via des mĂ©thodes contrĂ´lĂ©es (getters/setters)

Exemple : Encapsulation de base

public class Personne {
    // Attributs privés : cachés de l'extérieur
    private String nom;  // Privé : pas d'accès direct
    private int age;     // Privé : pas d'accès direct
    
    // Méthodes publiques pour accéder et modifier
    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;
    }
}

❌ Sans encapsulation (à éviter)

Exemple : Code sans encapsulation

public class Personne {
    // Attributs publics : accès direct (DANGEREUX)
    public String nom;
    public int age;
}

// Utilisation
Personne p = new Personne();
p.nom = "Jean";
p.age = -5;  // ❌ Problème : aucune validation possible
Problèmes :
  • Aucun contrĂ´le sur les valeurs assignĂ©es
  • Impossible de valider les donnĂ©es
  • Code client dĂ©pendant de l'implĂ©mentation interne

✅ Avec encapsulation (recommandé)

Exemple : Code avec encapsulation

public class Personne {
    // Attributs privés : protégés
    private String nom;
    private int age;
    
    // Getters
    public String getNom() {
        return nom;
    }
    
    public int getAge() {
        return age;
    }
    
    // Setters avec validation
    public void setNom(String nom) {
        if (nom != null && !nom.trim().isEmpty()) {
            this.nom = nom;
        }
    }
    
    public void setAge(int age) {
        if (age >= 0 && age <= 150) {  // Validation
            this.age = age;
        } else {
            System.out.println("Âge invalide !");
        }
    }
}

// Utilisation
Personne p = new Personne();
p.setNom("Jean");
p.setAge(-5);  // ✅ Validation : l'âge invalide est rejeté

5.2.2 – Avantages

L'encapsulation offre de nombreux avantages qui améliorent la qualité, la maintenabilité et la sécurité du code.

🛡️ Protection des données

L'encapsulation permet de contrôler et valider les valeurs assignées aux attributs, garantissant l'intégrité des données.

Exemple : Validation dans le setter

public class CompteBancaire {
    private double solde;
    
    public void setSolde(double solde) {
        if (solde >= 0) {  // Validation : le solde ne peut pas être négatif
            this.solde = solde;
        } else {
            System.out.println("Erreur : le solde ne peut pas être négatif");
        }
    }
    
    public double getSolde() {
        return solde;
    }
}

🔄 Flexibilité et maintenabilité

L'encapsulation permet de modifier l'implémentation interne sans affecter le code client qui utilise la classe.

Exemple : Changement d'implémentation

// Version 1 : Stockage simple
public class Personne {
    private String nom;
    
    public String getNom() {
        return nom;
    }
}

// Version 2 : Changement d'implémentation (ajout de logique)
public class Personne {
    private String nom;
    private String prenom;
    
    // L'API publique reste la mĂŞme !
    public String getNom() {
        return prenom + " " + nom;  // Retourne le nom complet
    }
    
    // Le code client n'a pas besoin de changer !
}

âś… Validation et contrĂ´le

Les setters permettent d'ajouter de la logique de validation, de transformation ou de notification lors de la modification des données.

Exemple : Validation et logique supplémentaire

public class Personne {
    private String email;
    
    public void setEmail(String email) {
        // Validation : vérifier le format de l'email
        if (email != null && email.contains("@") && email.contains(".")) {
            this.email = email.toLowerCase();  // Normalisation
            System.out.println("Email mis Ă  jour : " + email);
        } else {
            System.out.println("Format d'email invalide");
        }
    }
}

📊 Tableau de comparaison : Avec vs Sans encapsulation

Critère Sans encapsulation (public) Avec encapsulation (private + getters/setters)
Contrôle des données ❌ Aucun ✅ Validation possible
Flexibilité ❌ Code client dépendant ✅ Implémentation changeable
Sécurité ❌ Données vulnérables ✅ Données protégées
Maintenabilité ❌ Difficile ✅ Facile
Logique supplémentaire ❌ Impossible ✅ Logs, notifications, etc.

💡 Points clés à retenir

  • Principe : Rendre les attributs privĂ©s et utiliser des getters/setters publics
  • Protection : ContrĂ´le et validation des donnĂ©es
  • FlexibilitĂ© : PossibilitĂ© de changer l'implĂ©mentation sans affecter le code client
  • MaintenabilitĂ© : Code plus facile Ă  maintenir et Ă  faire Ă©voluer
  • SĂ©curitĂ© : DonnĂ©es protĂ©gĂ©es contre les accès non autorisĂ©s
  • Logique : PossibilitĂ© d'ajouter de la logique lors de l'accès aux donnĂ©es
Conseils pratiques :
  • Toujours rendre les attributs private (sauf cas très rares)
  • Utiliser des getters/setters pour tous les attributs qui doivent ĂŞtre accessibles
  • Ajouter de la validation dans les setters pour garantir l'intĂ©gritĂ© des donnĂ©es
  • L'encapsulation est l'un des piliers de la POO : respectez-la !