Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.



Documents pareils
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Héritage presque multiple en Java (1/2)

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Java Licence professionnelle CISII,

Une introduction à Java

Programmer en JAVA. par Tama

Généralités sur le Langage Java et éléments syntaxiques.

INITIATION AU LANGAGE JAVA

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

TP1 : Initiation à Java et Eclipse

Programmation par composants (1/3) Programmation par composants (2/3)

Initiation à JAVA et à la programmation objet.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

TD/TP PAC - Programmation n 3

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Diagramme de classes

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Langage Java. Classe de première SI

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

as Architecture des Systèmes d Information

Tp 1 correction. Structures de données (IF2)

TD/TP PAC - Programmation n 3

Chapitre 10. Les interfaces Comparable et Comparator 1

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Java - la plateforme

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Premiers Pas en Programmation Objet : les Classes et les Objets

Auto-évaluation Programmation en Java

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Chapitre 2. Classes et objets

Chapitre VI- La validation de la composition.

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Classe Interne, Anonyme & Enumération

RMI le langage Java XII-1 JMF

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Objets et Programmation. origine des langages orientés-objet

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Génie Logiciel avec Ada. 4 février 2013

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Programmation par les Objets en Java

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Cours 1: Java et les objets

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation Objet Java Correction

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Java c est quoi? Java pourquoi?

Utiliser Java sans BlueJ

Programmation Orientée Objet application au langage Java Version Novembre 2007

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Notion de thread (1/2)

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Remote Method Invocation (RMI)

Java Licence Professionnelle CISII,

Traduction des Langages : Le Compilateur Micro Java

Programmation Objet - Cours II

2. Comprendre les définitions de classes

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

Plan du cours. Historique du langage Nouveautés de Java 7

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Java Licence Professionnelle CISII,

et Programmation Objet

Programmation Orientée Objet en C#

PROGRAMMATION PAR OBJETS

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Package Java.util Classe générique

Design patterns. Design patterns - définition. Design patterns - avantages

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Corrigé des exercices sur les références

Support de cours et TD Programmation Orientée Objet

TP1. Outils Java Eléments de correction

4. Groupement d objets

Bases Java - Eclipse / Netbeans

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

TP, première séquence d exercices.

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

F. Barthélemy. 17 mai 2005

Les frameworks au coeur des applications web

Plan Pédagogique du cours

Application web de gestion de comptes en banques

Corrigés des premiers exercices sur les classes

Introduction au langage Java

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Java 1.5 : principales nouveautés

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Université de Bangui. Modélisons en UML

1 Définition d une classe en Java

UML. Diagrammes de classes (suite) Delphine Longuet.

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

Introduction au langage de programmation Java

Introduction à JDBC. Accès aux bases de données en Java

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Programmation en Java IUT GEII (MC-II1) 1

Transcription:

Encapsulation L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets. La visibilité dépend des membres : certains membres peuvent être visibles et d'autres non. La visibilité dépend de l'observateur : les membres de l'objet encapsulé peuvent être visibles pour certains objets mais pas pour d'autres. L'encapsulation a pour objectif d'améliorer la robustesse et l'évolutivité des programmes. 1

Robustesse du code et encapsulation Les objets doivent pouvoir protéger les données qu'ils contiennent. class Date{ // attributs int jour; int mois; int annee; class BilleterieSNCF{ // attributs Date d; class ProgrammeFarceur{ void faitfarce(billeteriesncf b){ b.d.jour = 32; Les objets doivent pouvoir protéger les méthodes qu'ils contiennent. class Tetris{ Piece creernouvellepiece(){ class ProgrammeEtourdi{ void faiterreur(tetris t){ Tetris t = t.creernouvellepiece(); t.creernouvellepiece(); 2

Evolution du code et encapsulation class PileDeChaines{ // attributs String[] pile; // méthodes void push(string s){ // ajouter s à la fin de pile String top(){ // renvoyer le dernier élément de pile String pop(){ // enlever le dernier élément de pile et le renvoyer boolean estvide(){ // renvoyer vrai si la taille de pile est 0, faux sinon class PileDeChaines{ // attributs ArrayList<String> pile; // méthodes 3

Que faut-il montrer? Principe de David Parnas : Une classe doit rendre visible ce qui est nécessaire pour manipuler ses instances et rien d'autre. L'implémentation d'une méthode doit utiliser ce qui est nécessaire au traitement qu'elle réalise et rien d'autre. 4

Encapsulation des données Par défaut, les attributs doivent être cachés. Leurs valeurs ne doivent être visibles et modifiables qu'au travers des méthodes. Il est cependant acceptable de laisser visible les constantes. objet o1 méthodes (accesseurs) objet o2 attributs m1 objet o3 m2 5

Encapsulation des méthodes Les méthodes intermédiaires qui ne sont pas destinées à être utilisées à l'extérieur de la classe doivent être cachées. class ListeDeTruc{ // méthodes void coupe(truc pivot){ void trier(){ this.coupe(); 6

Paquetages Java (1/4) En Java, il existe deux périmètres de visibilité : les classes et les paquetages. Un paquetage est un regroupement de classes. Les paquetages sont organisés hiérarchiquement comme des répertoires de classes. java java.lang java.io java.nio java.math java.net java.text java.util java.sql java.lang.annotation java.lang.instrument java.lang.reflect Annotation AnnotationTypeMismatchException Les noms des paquetages suivent la convention inverse des URI internet : com.monlogiciel.paquetage2 7

Paquetages Java (2/4) Pour utiliser dans un fichier java une classe C d'un paquetage p, on peut : - donner le nom de la classe in extenso : class Truc{ p.c variable = - ajouter une directive en tête du fichier : import p.c; import java.lang.*; class Truc{ C variable = import static java.lang.math.pi; On peut éviter de préfixer les constantes de classes par le nom de leur classe en utilisant import static : class Truc{ float f = PI*3; 8

Paquetages Java (3/4) Pour organiser ses propres classes en paquetage : - placer les classes dans un répertoire portant le nom souhaité - mettre en tête de fichier la directive package correspondante répertoire monpaquetage package monpaquetage; class Truc{ package monpaquetage; class Machin{ package monpaquetage; La compilation et l'exécution de ces classes doit se faire en précisant le chemin qui y mène : javac -classpath /monpaquetage/truc.java 9

Paquetages Java (4/4) Les paquetages représentent des espaces de nommage : deux paquetages peuvent contenir des classes de même nom. Exemple : les 3 interfaces javax.lang.model.element.name, javax.naming.name et javax.xml.soap.name sont différentes. Les paquetages permettent d'organisation les classes par thèmes, par applications. Exemples : java.applet contient les classes dédiées à la réalisation d'applications clientes pour pages web, java.security regroupe les classes dédiées à la gestion de la sécurité. Les paquetages permettent de moduler l'encapsulation. 10

Niveaux d'encapsulation (1/2) Les 4 niveaux d'encapsulation de Java sont par ordre de visibilité croissante : un membre privé (private) n'est visible que dans les instances directes de la classe où il est déclaré. un membre sans modifieur est visible uniquement dans les instances directes de la classe où il est déclaré et dans celles des classes du même paquetage. un membre protégé (protected) n'est visible que dans les instances, directes ou non, de la classe où il est déclaré (et donc aussi dans les instances des sous-classes) et dans les instances des classes du même paquetage. un membre public (public) est visible par n'importe quel objet. Ces 3 modifieurs se retrouvent en C++, Python, etc. 11

Niveaux d'encapsulation (2/2) Visibilité des membres selon leurs modifieurs et le niveau d'encapsulation modifieur classe paquetage sousclasses private visible visible visible protected visible visible visible autres classes public visible visible visible visible 12

Encapsulation des attributs Les attributs doivent a priori être privés (ou au moins protégés). Si besoin, des accesseurs et modifieurs publics sont définis et permettent de contrôler l'accès aux attributs. class Personne{ // attributs private String nom; private Vote v; private int pointure; private float fortune; // methodes public String getnom(){ return this.nom; public int getpointure(){ return this.pointure; public void donnersous(float s){ this.fortune = this.fortune.s; public float getfortune(object o){ if(o instanceof Etat) return this.fortune; 13

Encapsulation et héritage La redéfinition d'une méthode doit avoir une visibilité au moins égale à celle de la méthode de la super-classe. Cette contrainte est due à la liaison dynamique. class Truc{ public void m(){ class Machin extends Truc{ private void m(){ Truc t = new Machin(); t.m();?? Le masquage d'un attribut, géré par liaison statique, ne pose aucune contrainte sur l'encapsulation. 14

Encapsulation et abstraction Une méthode abstraite ne peut être privée car elle doit être implémentée dans une sous-classe. Elle peut être implémentée par une méthode ayant une visibilité plus large qu'elle-même. abstract class Truc{ abstract void m1(); protected abstract void m2(); class Machin extends Truc{ protected void m1(){ protected void m2(){ Une interface ne contient que des membres publics ou sans modifieur de visibilité. Les membres de classe se comportent comme les membres d'instances du point de vue de l'encapsulation. 15

Encapsulation des classes Une classe (ou interface) déclarée public est visible de partout, sinon elle n'est visible que dans son paquetage. package monpaquetage; public abstract class Liste{ public void ajoutelement(object o); public Object enleverelement(object o); public boolean estvide(); public Liste creerliste(){ return new ImplementationDeListe(); package monpaquetage; class ImplémentationDeListe extends Liste{ Les classes qui ne sont pas déclarées dans un paquetage font toutes partie du même paquetage «anonyme». 16

Classes internes Une classe interne est une classe définie à l'intérieur d'une autre classe. Une classe membre est définie au même niveau que les attributs et méthodes de la classe englobante. class A{ class B{ Une classe locale est définie à l'intérieur d'une méthode. public void method(){ class B{ Une classe anonyme est définie à l'intérieur d'une expression. Objet o = new B(){ 17

Classe membre Toute instance d'une classe membre est associée à une instance de la classe englobante. Une classe membre n'a donc de sens que si ses instances ne peuvent exister que comme parties d'instances de la classe englobante. class MorceauDeGruyere{ class TrouDeGruyere{ class Voiture{ class RoueDeVoiture{ On peut imbriquer des classes sur autant de niveaux que l'on veut. class Feu{ class Fumee{ class SignauxDeFumee{ 18

Classe membre et encapsulation Une classe membre a accès aux attributs et méthodes de la classe englobante, même s'ils sont privés. Une classe englobante à accès à tous les membres de sa classe interne même ceux qui sont privés. class A{ L'accès à l'instance de la classe englobante se fait dans la classe membre par NomClasseEnglobante.this (s'il n'y a pas d'ambiguité, le nom du membre de la classe englobante suffit). private int z; public void methode(){ class B{ A.this.methode(); z = 12; 19

Instanciation d'une classe membre L instanciation de la classe membre se fait à travers une instance de la classe englobante. class A{ class B{ class C{ public static void main(string[] t){ A instancedea = new A(); B instancedeb = instancedea.new B(); A.B autreb = new B(); A.B.C unc = instancedeb.new C(); 20

Classe membre et héritage L'héritage est totalement indépendant de l'imbrication de classe. class MorceauDeGruyere extends Aliment{ class TrouDeGruyere extends EspaceCirculaire implements Vide{ interface Vide{ public void remplir(matiere m); class EspaceCirculaire{ private int rayon; class Humain{ class Foetus extends Humain{ 21

Classe membre et abstraction Une interface ou une classe abstraite peuvent être membres d'une classe. class File { interface FileParser { boolean parse(); class CSVParser implements FileParser { public void parse() { class ODSParser implements FileParser { public void parse() { private FileParser fp; public File(String name){ if(iscsv(name)) this.fp = new CSVParser(); if(isods(name)) this.fp = new ODSParser(); 22

Classe membre de classe Si la classe membre est déclarée statique, elle n'est pas liée à une instance de la classe englobante. Le mot clé this ne peut y être employé, donc la classe membre de classe n'a pas accès aux attributs et méthodes non statiques de la classe englobante. Une classe statique a accès à tous les membres statiques de la classe englobante. class A{ Il est possible d'instancier une classe membre statique sans passer par une instance de la classe englobante. static class B{ public static void main(string[] t){ B instancedeb = new B(); 23

Classe membre et JVM Le compilateur insère automatiquement dans la classe membre un attribut privé qui référence l'instance englobante. Le compilateur ajoute automatiquement à tous les constructeurs de la classe membre un argument caché qui pointe sur la classe englobante. Il ajoute aussi des accesseurs vers les membres privés dans les deux classes. La JVM gère les classes membres comme des classes normales. class A{ class B{ compilation A.class A$B.class 24

Classe locale (1/3) class A{ Une classe locale n'est visible que dans le bloc de code où elle est définie (elle est forcément «privée»). public void method(){ class B{ Une classe locale définie dans une méthode d'instance a accès aux attributs et méthodes de la classe englobante, même s'ils sont privés. Une méthode locale définie dans une méthode de classe n'a accès qu'aux membres de classes de la classe englobante. 25

Classe locale (2/3) Une classe locale ne peut utiliser une variable locale que si elle est déclarée final. Une class locale ne peut être définie que statique ou abstraite. class A{ public void method(){ final int i = int j = class B{ int k = i; int l = j; Le compilateur crée pour chaque classe locale un fichier.class numéroté. class A{ void methode(){ class B{ class C{ compilation A$1$B.class A$2$C.class 26

Classe locale (3/3) Une classe locale ne sert pas vraiment à modéliser des données, mais constitue une technique permettant de définir localement un type. Le plus souvent, on utilise une classe locale pour spécialiser une classe existante et réutiliser ainsi du code localement. class Outil{ class BuveurDeVin{ public void deboucherbouteille(bouteille b){ class TireBouchon extends Outil{ TireBouchon tb = new TireBouchon(); tb.debouche(b); 27

Classe anonyme (1/2) Une classe anonyme est une classe locale sans nom, définie dans une instruction et instanciée dans la foulée. interface ActionListener{ public void actionperformed(actionevent ae); class InterfaceGraphique{ public InterfaceGraphique(){ Button bouton bouton.addactionlistener(new ActionListener(){ public void actionperformed(actionevent ae){ ; Une classe anonyme ne peut être réutilisée, ne peut avoir qu'une seule instance et n'a pas de constructeur (l'instance unique est créée avec le constructeur par défaut). 28

Classe anonyme (2/2) Une classe anonyme n'autorise aucun modifieur et est toujours final (implicitement). Une classe anonyme subit les mêmes restrictions d'accès aux membres de la classe englobante qu'une classe locale. Le compilateur génère pour chaque classe anonyme un fichier.class numéroté. class A{ void methode(){ new class B(){ compilation A$1.class 29