Chapitre 4:
Encapsulation
1
Définition
Le principe de l’encapsulation dit qu’un objet ne doit pas
exposer sa représentation interne au monde extérieur.
Représentation interne d’un objet:
Attributs
Méthodes
Monde extérieur
Les autres classes dans le même package
Les classes des autres packages
2
Définition
L'encapsulation a donc deux aspects :
Offrir un ensemble de services, un accès simple.
Être une boîte noire (black box) en cachant des détails
de structure et de fonctionnement
3
Principe
Voici un exemple avec la classe 'Livre' qui offre
des services de manipulation de livres d'une
bibliothèque.
Parmi les services qu'on peut obtenir:
Livre(): pour créer et enregistrer un
nouveau livre dans la bibliothèque (appel au
constructeur)
getTitre(): pour avoir le titre du document
getEdition(): pour connaître l'année de
publication
setEdition(int date)
4
Principe
La boîte noire cache des
détails. Elle cache les variables
titre, auteur et année.
On se contente de connaître
comment manipuler le Livre à
l'aide des services offert par la
classe.
5
Principe
L’encapsulation permet de définir deux niveaux de perception
de l’objet:
Niveau externe: propriétés de l’objet visible par tout le
programme
Niveau interne: propriétés de l’objet visible seulement dans
sa classe.
o méthodes et attributs accessibles uniquement depuis
l’intérieur de l’objet (ou objets similaires)
6
Encapsulation contrôlée
Le bon usage de l’encapsulation à accès contrôlé est
d’appliquer la restriction maximale de visibilité aux classes,
instances et champs d’objets.
Notions de package
Les spécificateurs d’accès aux classes et à leurs instances
Les spécificateurs d’accès aux champs des objets
7
Encapsulation contrôlée
La notion de « package » (première approche)
Les packages Java fournissent le moyen de regrouper des
classes en modules.
Les packages Java sont séparés entre eux par des frontières
parfois franchissables, parfois non.
Un package étant défini, il regroupe un ensemble de classes
dont toutes ne sont pas utiles de l’extérieur du package.
8
Encapsulation contrôlée
La notion de « package » (première approche)
Les packages Java fournissent le moyen
de regrouper des classes en modules.
Les packages Java sont séparés entre eux
par des frontières parfois franchissables,
parfois non.
Par défaut, en Java, lorsqu’aucun spécificateur d’accès n’est précisé,
l’accès est défini sur la totalité du package contenant.
9
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux classes et à leurs instances
Le spécificateur PUBLIC :
package livres; La classe Livre et ses instances sont accessibles
// La classe Livre par TOUS les packages.
public class Livre{
… Restriction d’accès : aucune
}
Le spécificateur PAR DÉFAUT :
La classe Livre et ses instances ne sont accessibles
package livres; QUE de leur propre package
// La classe Livre (c’est-à-dire depuis toute classe ou objet du package
class Livre{ « livres »)
…
} Restriction d’accès : package
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux classes et à leurs instances
Classe public
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux classes et à leurs instances
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
Le spécificateur public :
package livres; La méthode boolean exit() est accessible sur
public class Livre{ TOUTES les instances de classe Livre.
…
public boolean existe ( ) Restriction d’accès : aucune
{…} mais reste subordonnée à la visibilité de la
} classe (qui devrait logiquement être déclarée
public comme ici !)
Le spécificateur private:
package livres;
public class Livre{ La méthode boolean exist() n’est accessible QUE des
…
private boolean exist( ) {…} instances de classe Livre elles-mêmes.
} Restriction d’accès : l’instance de classe elle-même
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
Le spécificateur PAR DÉFAUT :
package livres;
public class Livre{ La méthode boolean exist() est accessible DE TOUT le
… package « livres ».
boolean exist( ) {…}
Restriction d’accès : package
}
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
L’attribut public
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
L’attribut private
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
L’attribut protected
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
La méthode public
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
La méthode private
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
La méthode default
Encapsulation contrôlée
Les spécificateurs d’accès contrôlé aux champs des objets
La méthode protected
Encapsulation: Accesseur et mutateur
Tous les attributs sont private ? Et si on a besoin de les utiliser
depuis l’extérieur de la classe ?
1. Un accesseur (méthode get ou getter): lire la valeur d’un
attribut
2. Un mutateur (méthode set ou setter): modifier la valeur d’un
attribut
Le getter et le setter doivent être déclarés public
Encapsulation: Accesseur et mutateur
1. Le prototype du getter
public type_attribut getAttribut()
2. Le prototype du setter
public void setAttribut( type_attribut val)
L’intérêt de l’encapsulation
1. Meilleure visibilité et cohérence (permet une plus grande
modularité)
2. Préservation de la sécurité des données (inaccessibles de
l’extérieur)
3. Facilité de la mise à jour des applications: (un projet réalisé par
plusieurs développeurs): Chaque développeur est responsable
d'une partie du projet. Si les classes dont il est le responsable
sont proprement encapsulées, il pourra modifier par la suite
leurs représentations internes, sans que cela perturbe le travail
des autres développeurs du projet susceptibles d'utiliser ces
classes.
Application
Afficher les coordonnées d’un point donné.
Compléter le code suivant pour pouvoir accéder aux
attributs privés x et y.