Vous êtes sur la page 1sur 14

Chapitre 3

Encapsulation
Accesseurs et
mutateurs

Dr. Aoudia, 2023 1


Encapsulation
▪ L’encapsulation consiste à regrouper les données pertinentes dans des structures
spécifiques. Ensuite omettre l’accès direct à ces données. Finalement, implémenter des
moyens d’extraction et de modification de ses données, de telles sortes à gérer ces
processus.

▪ L’encapsulation préserve la confidentialité des données, à travers les getters et les setters.
▪ Ne doit être visible de l’extérieur que ce qui est nécessaire, les détails d’implémentation sont « cachés »

▪ L’encapsulation rend l’utilisation d’une classe indépendante de son implémentation.

Dr. Aoudia, 2023 2


Encapsulation: Accès aux attributs d’une
super-classe (Classe mère)
information hiding

• Cacher ou isoler l’implémentation d’une classe via l’accès


private
• Gérer l’accès avec des accesseurs et des mutateurs (Getter et
Setter)

Limitez l’accès aux attributs et aux méthodes

• private pour les attributs


• Choisir au plus restreint selon l’objectif des méthodes

Dr. Aoudia, 2023 3


Encapsulation: Accesseur et mutateur

Fournir des méthodes d’accès (accessors, « getters ») et des


mutateurs (modifiers, « setters »)
• Accesseur : lit l'état de l'objet sans le modifier
• Mutateur : change l'état de l'objet
• Avec accès public pour être utilisable par les autres classes

Les classes sans mutateur sont immuables :


• Leurs variables sont private public class Max {
• Leur état ne peut pas être modifié private int max = 999999;
• String et Integer sont immuables public int getMax() { return max; }
• java.util.Date est muable public void setMax(int m) { max = m; }
}
Dr. Aoudia, 2023 4
Encapsulation: Accesseur et mutateur
public class Max {
private int max = 999999;

max est privée: L’accès en


dehors de la classe est public int getMax() { return max; }
refusé public void setMax(int m) { max = m; }
}

L’accès à la variable privée se fait via des


Les deux méthodes méthodes spécifiques.
getMax et setMax sont
L’encapsulation protèges les données
publiques
privées
Dr. Aoudia, 2023 5
Source: http://etuly.com/cours/petit_page.php?cours=15&pages=2

Encapsulation: Accesseur et mutateur

Dr. Aoudia, 2023 6


Encapsulation:
Références muables
• Ne pas partager les références
muables (suite)
• Le danger : getHireDate brise
l’encapsulation

Employee harry = ... ; Bienque Employee implémente la méthode


Date d = harry.getHireDate(); getHireDate pour encapsulter la variable privée
d.setTime(t); // Change l’état de hireDate, l’encapsultation sera brisée à cause de cette
harry !
méthode get, tant qu’elle fournie la Valeur cachée à
• Remède : utiliser un clone ou instancier
l’objet d. Celui-ci est muable car il est une instance de
une copie manuellement avec un la classe Date qui est elle-même muable.
constructeur
public Date getHireDate() {
return (Date) hireDate.clone();
}

Retourner une copie de la variable va protéger la Le fait de changer la date pour l’objet d, il sera de
variable native. L’utilisateur de la méthode peut même pour la variable hiredate qui pointe vers la
changer la variable retournée sans affecter l’originale
à laquelle il n’a pas accès même entité
Dr. Aoudia, 2023 7
Effets de bord d’une méthode :

• Tout changement d'état observable lorsque la

Encapsulation: méthode est appelée. Cela peut changer des

Effet de bord variables locales ou globales.

• Un mutateur a l’effet de changer son

paramètre implicite

Dr. Aoudia, 2023 8


Encapsulation
Effets de bord d’une méthode : public class Voiture {

• Une méthode peut avoir d’autres effets private float vitesse;


• Modifier un paramètre explicite /**
* @return La vitesse en km/h de la
voiture
*/
public float getVitesse() {
return vitesse;
Dans la méthode main() }

Voiture v = new Voiture(); /**


v.accelerer(88.0f); * Pour accélérer la voiture
* @param deltaVitesse Le vitesse
supplémentaire
*/
Ici on modifie la valeur du paramètre explicite public void accelerer(float
deltaVitesse) {
vitesse, qui est private! vitesse = vitesse + deltaVitesse;
}

Référence de l’exemple: https://gayerie.dev/docs/java/langage_java/attributs_et_methodes.html


Dr. Aoudia, 2023 9
Communiquer avec ses
relations directes

Encapsulation Ne pas dépendre de leur


implémentation (Utiliser
Get et Set)

connaissance minimale)
Connaissance limitée des
autres classes
Éviter de récupérer un objet
Loi de Déméter
(principe de dans un autre objet

Un objet est le seul à


connaître sa structure
interne

ses paramètres (implicite et


explicites)

Une méthode devrait


les variables de sa classe
utiliser uniquement :

des objets construits dans la


Dr. Aoudia, 2023 méthode 10
Exemple: Lois Déméter

public static void displyaPostCode(Compagny compagny , String employeeName){

String postcode= compagny.getEmployee(employeeName).getAddress().getPostCode();


System.out.println(postCode);

1 2 3 postCode

On appelle la méthode getPostCode()


Correct: paramètre explicite On appelle getAddress() sur l’objet réccupéré de la classe Adress: On a augmenté la
de getEmployee() => Correct: paramètre dépendance (À éviter)
implicite car on dépend de la classe Emplyee
réccupéré de (1)

Alternative: utiliser des paramètres spécifiques dans la classe, ou ajouter une méthode
capable d’avoir directement les paramètres Dr. Aoudia, 2023 11
Encapsulation
Attention aux getters systématiques
Éviter d’utiliser un objet retourné par un appel de
Une classe n’est pas qu’une structure de données méthode (à moins qu’il ne soit créé par cette
méthode)

Avantages & inconvénients


Moins de dépendance, plus
Maintenance plus simple Davantage de code, surcharge
d’adaptabilité

Dr. Aoudia, 2023 12


Encapsulation:
Exemple
complet

Source: https://perso.esiee.fr/~mahmoudr/engineering/java/java03.pdf

Dr. Aoudia, 2023 13


Merci
Questions

Dr. Aoudia, 2023 14

Vous aimerez peut-être aussi