Les concepts de la Programmation Oriente Objet en Java
Prawee Sriplakich
[Link]@[Link] Ce support de cours est disponible sur [Link]
mise a jour : 18/09/2006
Organisation
1. Introduction la technologie Java 2. Concepts POO (basiques) 3. Environnements de Dveloppement en Java. 4. Concepts POO (avancs) 5. Tableaux, collections et Map 6. Manipulation des entres/sorties 7. Threads et synchronisation 8. Manipulation des documents XML avec Java 4h
8h 6h 6h 6h 6h
2
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Evaluation
50% Contrle continu
Les TPs suivants seront valus :
4.3 : Ralisation des interfaces du mcanisme d'vnements 6.1 : Flux de donnes et srialisation 8.2 : Srialisation et dstatisation dobjets en XML avec DOM
Travail en binme Les critres dvaluation sont :
Lexplication sur le lancement du programme. La correction du programme. Le scnario de test couvrant toutes les fonctionnalits du programme La lisibilit du code et le commentaire sur le code. Le Java Doc et le document expliquant larchitecture globale du programme.
50% Examen (2h)
Les documents du cours et des notes personnelles sont autoriss.
3
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
1. Introduction la technologie Java
Java et une plateforme d'entreprise
Quest ce que Java ?
Un langage de programmation interprt et compil.
Java code Byte code Byte code est interprt par JVM (Java Virtual Machine)
Les applications Java s'excutent sur quel type de machines ?
Tous les types de matriels disposant d'une JVM
5
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Comment cela fonctionne t-il ?
La JVM fournit un environnement d'excution homogne (malgr l'htrognit des OS/ matriels)
6
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Le Java Development Kit
Java est un langage de programmation.
Le Java Development Kit est une boite outils :
un compilateur java une machine virtuelle JVM un ensemble de bibliothques (API) pour faciliter la programmation.
Ex. Gestion d'E/S (ficher, rseaux), les collections (liste, ensemble) , IHM
7
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Applets et applications
Deux types de dveloppements sont possibles :
les Applets
Un programme s'excutant au sein d'un navigateur web. Tlchargeable en mme temps qu'une page web Pas besoin d'installation Fonctionnalit limit (par mesure de scurit)
les applications
Un programme standard s'excutant sur la JVM. Moins de restriction (Les utilisateurs doivent faire confiance avant de l'excuter)
8
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
La plate-forme entreprise java
Un grand nombre de bibliothques ont t dveloppes autour du langage Java Elles offrent des fonctionnalits communes des applications d'entreprises
Ex. Gestion de web, de base de donnes, de transactions etc. Simplicit du dveloppement des applications complexes La
plateforme concurrence : .NET
9
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
2. Concepts POO (basiques)
Contenu:
Class, Objet, Instanciation, Attribut, Mthode, Message (Invocation), Cycle de vie d'objets, Constructeur, Package
10
Class et objet
Objet
reprsente une entit dans le monde rel ou un lment du programme. Possde des tats et des comportements Ex. un objet "Tlvision"
ses tats = { allum/teint, chane courante, volume de son }, ses comportements = { allumer, changer de chane, changer de volume de son, teindre }
Class
Un objet est une instance d'une classe la classe dcrit l'objet. Description des tats des attributs de la classe Description des comportements des mthodes de la classe.
11
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple d'une class
public class Television { // Etat private int volume; private int chaine; private boolean estAllume; // Comportements public void allumer() { } public void eteindre() { } public void augmenterVolume() { } public void reduireVolume() { } public void changerChaine(int _chaine) { } }
NB. Par convention, les noms des classes commencent par majuscule ceux des attributs/ mthodes commence par minuscule
12
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Instanciation
Une classe peut tre rutilise pour instancier plusieurs objets
Class Television boolean estAllume int volume int chaine Objets estAllume: true volume: 5 chaine: 1
estAllume: true volume: 6 chaine: 2
estAllume: false volume: 0 chaine: 0
13
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Question
Dfinir une classe reprsentant des voitures.
Les tats des objets voiture doivent dcrire
Dmarr ou non, position de boite de vitesse, vitesse niveau d'essence,
Les comportements d'une voiture incluent:
Dmarrer, arrter Changer boite de vitesse Acclrer, ralentir Tourner (selon le dgr spcifi)
14
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Solution
public class voiture { private boolean estDemarre; private int posBoiteVitesse; private int vitesse; private int niveauEssence; public void demarrer() { } public void arreter() { } public void setPosBoiteVitesse(int pos) { } public void accelerer() { } public void ralentir() { } public void tourner(int degre) { } }
15
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Le typage d'attributs (et variables)
Un attribut peut tre typ : par une classe (Sa valeur est donc une rfrence vers un objet instance de cette classe) par un type primitif:
boolean, short, int, long, float, double byte, char.
Par un tableau de type primitif, ou de type classe
Ex. int[] att1; Television[] att2; Un array est un objet
NB. Une chaine de caractres est un objet instance de la class String
16
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Mthodes
Le corps d'une mthode contient des instructions comme la programmation classique. Il peut accder aux attributs de la classe Ex. public void changerChaine(int _chaine) { if(_chaine<0 || _chaine>108) { [Link]("chane invalide "); } else { chaine = _chaine; // Accs l'attribut chaine } }
17
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Attribut "this"
Lorsque des variables locales portent les mmes noms que les attributs de la classe, vous devez utiliser l'attribut "this" pour les distinguer. Ex. public void changerChaine(int chaine) { if(chaine<0 || chaine>108) { [Link]("chane invalide "); } else { [Link] = chaine; // [Link] signifie l'attribut de la classe } }
18
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Interaction entre objets: messages
Lors qu'un programme s'excute, il comporte d'un ensemble d'objets et ces objets changent des messages. Echange de messages = invocation d'une mthode Les paramtres sont envoy dans le message. un telecommande une television
changerDeChaine(3)
19
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Interaction entre objets : via rfrence entre objets
Afin qu'un objet A puisse invoquer une mthode de l'objet B, A doit avoir une rfrence vers B. Ex.
public class Telecommande { Television t; // une rfrence (un attribut) . public void boutonChaineAppuye(int boutonNo) { [Link](boutonNo); // invocation } }
20
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Question
Dfinir une classe Messenger
Un objet Messenger reprsente une messagerie d'un utilisateur. Il porte un identifiant, celui de l'utilisateur Il rfrence des objets Messenger auxquels il peut envoyer un message. On peut lui ajouter un contact. Il accepte un texte de l'utilisateur et le diffuse aux autres. Lors de la rception du texte diffus, il l'affiche sur l'cran
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
julien
julie
pierre
21
Solution
import [Link]; public class Messenger { private String idUtilisateur; private Vector<Messenger> contacts = new Vector<Messenger>(); public void ajouterContact(Messenger contact) { [Link](contact) } public void diffuser(String texte) { for(int i=0; i< [Link](); i++) { Messenger contact = [Link](i); [Link](texte); } } public void recevoir(String texte) { [Link](idUtilisateur + " recoit: " + texte); } }
22
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Comment commencer le programme: Mthode main
Un programme Java = un ensemble de classes. Une mthode main doit tre dfinie dans une des classes. Elle doit avoir la signature:
public static void main(String[] args) Le tableau <<args>> contient des paramtres passs par la commande d'excution d'application
Ex. java MyAppli p1 p2 p3
args est donc {"p1", "p2", "p3"}
23
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Un exemple de la classe main
public class ClasseMain { public static void main(String[] args) {
// creation d'objets
Voiture v = new Voiture(); Personne p = new Personne();
// dclancher interaction entre objets
[Link](v); } }
En gnral, la mthode main sert :
Configurer le programme: (crer des objets initiaux du programme) Dclencher l'interaction entre ces objets
24
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Cycle de vie d'objets : cration
Pendant l'excution du programme, les objets peuvent tre cres et dtruits de manire dynamique. La cration d'un objet se fait par l'oprateur new suivi par le nom d'une classe
Ex new Voiture() Voiture() est en effet une mthode spciale, appele le "constructeur de la classe".
Le constructeur peut avoir des paramtres permettant de spcifier l'tat initial de l'objet
Ex. new File("[Link]") // crer un objet reprsentant un ficher "[Link]".
25
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple d'un constructeur
public class Messenger { private String idUtilisateur; public Messenger(String _idUtilisateur) { idUtilisateur = _idUtilisateur; } . }
26
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Cycle de vie d'objets : objets en cours d'utilisation
L'objet en cours d'utilisation doit tre rfrenc par une variable et un attribut. (sinon on ne pourrait pas l'utiliser !!)
Ex. Voiture v = new Voiture(); // L'objet cr est rfrenc par la variable v.
Un objet peut tre rfrenc par plusieurs variables
Ex. Voiture v1 = new Voiture(); Voiture v2 = v1; // v1 et v2 rfrencent le mme objet.
Pour utiliser l'objet, on invoque les mthodes de l'objet
Ex. [Link](); // <<[Link]()>> donnera le mme effet car elle rfrence le mme objet
27
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Cycle de vie d'objets : destruction
Les objets non rfrencs sont automatiquement dtruits
Ex1. Voiture v = new Voiture(); v = null; // v ne rfrence plus l'objet, donc il sera dtruit Ex2. public void m() { Voiture v = new Voiture(); } // v n'existe pas en dehors de la mthode, donc l'objet sera dtruit la fin dexcution de la mthode
28
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Question
L'objet rfrenc par v sera-il dtruit la fin excution de m() ? public class VoitureManager { Voiture[] voitures = new Voiture[10]; .. public void m() { Voiture v = new Voiture(); voitures[3] = v; v = null; } }
29
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Question
Reprendre l'application Messenger, crire la mthode main (dans une classe Main) servant commencer le programme. La mthode main doit configurer 3 objets Messenger (pour Pierre, Julie, Julien) avec les liens entre eux. Elle dclenche l'application en demandant Pierre de diffuser un texte.
30
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Solution
public class Main { public static void main(String[] args) { Messenger pierre = new Messenger("pierre"); Messenger julie = new Messenger("julie"); Messenger julien = new Messenger("julien"); [Link](julie); [Link](julien); . // similaire pour julie et julien [Link]("runion demain 10h"); } }
31
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Organisation d'application: package
Une application peut contenir un grand nombre de classes.
Un package permet de grouper un ensemble de classes reprsentant un module d'application modularit
Hirarchie de packages:
Un package peut contenir non seulement des classes mais galement des sous packages Ex. mon_appli.[Link] est une hirarchie de 3 packages
Espace de nommage
Differents packages peuvent avoir chacun une classe portant le mme nom. Ex. La classe "Client" du package "[Link]" est diffrente de la classe "Client" du package "[Link]"
[Link] vs. [Link]
Eviter le conflit de noms lors de l'intgration de plusieurs modules d'une application.
32
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Organisation des classes dans les packages
Chacune des classes est un fichier. Les fichiers doivent tre placs dans le bon rpertoire selon le package Dans chaque classe, on dclare le package au dbut du fichier
Mot cl: package
Ex. La classe ProductBrowser est dans le package mon_appli.[Link]
33
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Spcification de classes dans les autres packages
Dans le code d'une classe, une autre classe dans un autre package peut tre spcifi avec la forme [Link] Cette forme est appele <<nom qualifi>> d'une classe Ex.
package mon_appli.[Link]; public class ProductBrowser { mon_appli.[Link] ps; . }
34
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Spcification de classes dans les autres packages avec <<import>>
On peut viter de rpter le nom qualifi plusieurs fois grce la dclaration <<import>> On peut importer une seule classe d'un package ou toutes ses classes Ex. : importer toutes les classes dans le package mon_appli.bd.
package mon_appli.[Link]; import mon_appli.bd.*; public class ProductBrowser { ProductSearcher ps; ProductSearcher ps2; . }
35
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
3. Environnements de Dveloppement en Java
Contenu:
IDE, Complication, Excution, Dbuggage, Gnration de documentation, Dploiement
36
Environnement classique et IDE
Deux faons de dvelopper: Environnement classique
Complication/ execution par ligne de commande javac *.java : compiler des fichiers Java. java [nom de la classe main] : excuter l'application
IDE (Integrated Development Environment)
Facilits
Complication automatique Soulignements d'erreurs syntaxiques Dbuggage avec interface graphique
Ex. Eclipse
37
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Utilisation d'environnement classique
Crer des classes avec votre diteur prfr (Emac, Bloc-note) Mettre des classes dans les rpertoires hirarchiques selon leur package. Ouvrir la console de commande Positionner au rpertoire racine (contenant les packages du plus haut niveau)
Dans l'exemple de mon_appli, ce rpertoire contient le rpertoire mon_appli
Complier: javac [une liste des fichiers Java]
Ex: javac mon_appli/bd/*.java mon_appli/ihm/client/*.java mon_appli/ihm/admin/*.java
Excuter: java [le nom qualifi la classe main]
Ex. java mon_appli.[Link] NB. il faut positionner dans le bon rpertoire (pour que la JVM puisse trouver les classes ncessaires)
38
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Utilisation de lDE Eclipse
Crer un projet
File New projet
Crer des classes dans le rpertoire source (par dfaut c'est le rpertoire du projet)
File New class
La complication se fait automatiquement lors de la sauvegarde des classes.
Les erreurs syntaxiques sont soulignes
Excution
Slectionner la classe <<main>> Cliquer droit Run as Java Application
39
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Dbuggage
Le dbuggage permet d'analyser le comportement du programme lors de son excution
Dcouvrir des erreurs.
L'ide consiste arrter un programme un moment donn et examiner l'tat des objets du programme. Debuggeur: un JVM qui offre le moyen d'arrter l'excution du programme une ligne spcifie (appel point d'arrt).
Ex.
jdb (IHM ligne de commande) usage: jdb [nom de la classe main] Eclipse (IHM graphique) usage: slectionner la classe main, cliquer droite Debug as Java Application
Diffrentes manires pour reprendre l'excution
Passer la ligne suivante ("step over") Entrer dans le code de la mthode qui va tre invoque ("step into") Excuter juste la fin de la mthode et retourner l'objet invoquant la mthode ("step return") Excuter juste au point d'arrt suivant ("resume")
40
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Dbuggage avec Eclipse
Contrle de la reprise d'excution Etat des objets et variable locales La pile d'invocation (qui appelle qui)
Point d'arrt
41
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Documentation (javadoc)
La documentation facilite l'entretien de logiciel.
Rutiliser, corriger des erreurs, faire voluer, etc.
Un exemple: la documentation des classes standard Java
[Link]
On peut gnrer automatiquement le document partir du code source
Mais il faut mettre des commentaires sur le code source !
Ex. La classe String offre la mthode subString() permettant d'extraire une partie de la chane de caractres.
42
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Question : utilisation de la documentation
Chercher la description de la classe Integer
Quelle mthode permet de convertir une chane de caractres vers un nombre entier (int) ?
Chercher la classe Characters
Quelle mthode permet de tester si un caractre est minuscule ou majuscule
Chercher la classe StringTokenizer
Ecrire un programme permettant de couper une phrase en mots et les afficher (un mot par ligne). Conseil : mthodes hasMoreToken(), nextToken()
String: "chercher une class" afficher chercher une class
43
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Documentation: ajouter des commentaires au code
Entre /** Mot cl:
@param, @return, @exception
*/ (et non /* */ ).
Devant la dclaration d'une classe, d'une mthode, ou d'un attribut
44
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Documentation: la gnration
Avec ligne de commande
javadoc [fichiers Java]
Avec Eclipse
Slectionner le package Cliquer droite Export Javadoc
Il est conseill de rendre le javadoc gnr dans le compte rendu du contrle continu.
45
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Dploiement
dploiement d'applications sous forme de fichiers d'archivage (JAR) Un fichier jar ressemble un fichier ZIP. Il contient:
Des classes compiles Du code source (optionnel) Des donnes ncessaires pour l'application (ex. images, donnes de configuration)
Comment crer un fichier JAR
Ligne de commande
jar cvf [liste des fichiers]
Eclipse
Slectionner le package Cliquer droite Export JAR file
46
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Dploiement: comment utiliser le fichier JAR ? Pour excuter la classe main localis dans un fichier jar, il faut dire la JVM de chercher la classe dans ce fichier Utiliser le paramtre cp (classpath)
Ex. java -cp [Link] [Link]
47
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 3.1 Cration et excution d'une application
Crer l'application Messenger avec Eclipse
48
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 3.2 Dbuggage
Dbugger l'application Messenger avec Eclipse Mettre le point d'arrt sur
[Link](julien);
Examiner les 3 objets messenger Utiliser le contrle de la reprise d'excution pour entrer dans la classe Vector:
Comment la classe Vector stocke t-elle les objets Messenger? A quelle index du tableau l'objet sera-il ajout?
Fixer un autre point d'arrt
[Link](idUtilisateur + " recoit: " + texte); dans la mthode recevoir ()
Reprendre l'excution jusqu' ce point d'arrt ("resume") Examiner la pile d'invocation
Qu indique t-elle? Quel objet Messenger est-il en train de recevoir un texte ?
Refaire "resume" et observer la diffrence dans la pile d'invocation Dans chaque tape, faire la capture-cran et rpondre aux questions
49
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 3.3 Java Doc
Gnrer un javadoc de l'application Messenger avec Eclipse Ajouter des commentaires au code et rgnrer le javadoc
50
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
4. Concepts POO (avancs)
Contenu:
Hritage (Polymorphisme, Interface, Class abstraite, relation <<instance de>>, casting) Visibilit et encapsulation Attributs et Mthodes statiques Exception
51
Hritage
Une hritage est une relation entre deux classes. Ex. Etudiant hrite de Personne:
La classe tudiant et un sous-type (sous-classe) de la classe Personne (superclasse). Personne Object
Syntaxe: mot cl "extends"
public class Etudiant extends Personne { }
En Java, une classe ne peut pas hriter de plus d'une classe. Si l'hritage n'est pas dclar, la classe hrite implicitement de [Link]
Etudiant
Enseignant
une hirarchie de classes
52
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Smantique d'hritage: attributs et mthodes
La sous classe (ex. Etudiant) possde des attributs et des mthodes dfinis dans la superclasse (ex. Personne). Ex.
public class Personne { String nom; public void envoyerMail( String adr, String message) { .} } } public class Etudiant extends Personne { String noEtudiant; Etudiant(String _nom, _noEtudiant) { nom = _nom; noEtudiant = _noEtudiant; envoyerMail("admin@[Link]", "creation de dossier : " + nom); }
53
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Smantique d'hritage: redfinition
(autrement dit spcialisation, <<overriding>>) La sous classe peut redfinir les mthodes dj existant dans la superclasse. Les mthodes redfinies doivent garder la mme signature. Ex.
public class Personne { String nom; public void afficher() { [Link]( "Personne : " + nom); } } public class Etudiant extends Personne { public void afficher() { [Link]( "Etudiant : " + nom + " no: " + noEtudiant); } }
54
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Etude de cas: redfinition de la mthode equals()
Comparaison par identit
Deux variables de type objets sont gales si elles rfrencent le mme objet (oprateur ==) Ex.
String s1 = "hello"; String s2 = "hello"; String s3 = s1; [Link](s1 == s2); // false : pas le mme objet [Link](s1 == s3); // true
Comparaison par le contenu
Deux objets sont gaux si leur contenu se ressemble.
Personnalisation de comparaison
La classe Object propose la mthode <<boolean equals(Object unAutre)>> pour comparer deux objets. Elle peut tre redfinie pour personnaliser la faon de comparaison. Les classes standard Java (ex. String, Integer) redfibir equals() pour appliquer la comparaison par contenu.
Ex. [Link]([Link](s2)); // true
55
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple: redfinition de la mthode equals()
Object
public Personne { String noSecu; public boolean equals(Object autre) { if(autre instanceof Personne) { Personne p2 = (Personne) autre; if([Link]([Link])) return true; } return false; } }
equals() { // comparer par identit }
Personne
equals() { // comparer par contenu (no de scu sociale) }
String
equals() { // comparer par contenu }
56
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Accs aux mthodes redfinies dans la superclass
Mme si la sous classe redfinit des mthodes de la superclasse, elle a le moyen d'accder ces mthodes en utilisant le mot cl <<super>>.
public class A { public A(String s) { [Link]("A : " + s); } public void m1() { [Link]("A.m1"); } public void m2() { [Link]("A.m2"); } } // main B b= new B("hello"); b.m1(); public class B extends A { public B(String s) { super(s); [Link]("B : " + s); } public void m1() { super.m1(); m2(); // pas besoin de faire super.m2(); [Link]("B.m1"); } } Rsultat : A : hello B : hello A.m1 A.m2 B.m1
57
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Smantique d'hritage: Substituabilit
L'objet instance de la sous-classe peut se substituer l o l'objet instance de la superclasse est requis. Ex1.
Personne p = new Etudiant();
Ex.2.
Soit la mthode imprimerInfoPersonne() dfinit
public void imprimerInfoPersonne(Personne p) { }
Il est possible de passer l'objet Etudiant comme le paramtre.
Etudiant e = ; [Link](e);
58
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
getClass() et instanceof : Retrouver le type objet.
Le problme:
methode(Object param) { // param est-il un Etudiant? un Enseignant? ou autre?. }
La solution:
getClass() : retrouver la classe d'objet
// obtenir le nom de la classe de l'objet [Link]([Link]().getName());
Instanceof : tester le type d'objet
// supposant que param est instance de la classe Etudiant [Link](param instanceof Etudiant); // true [Link](param instanceof Personne); // true [Link](param instanceof Enseignant); // false
59
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Casting: convertir une variable vers un type plus spcifique
Le problme :
Object o = . ; if(o instanceof Etudiant) { // [Link](); illgal // Maintenant on sait que o est de type Etudiant, // mais comment invoquer la mthode afficher() // de la classe Etudiant? }
La solution: Casting.
Etudiant e = (Etudiant) o; // les variable e et o rfrencent le mme objet // mais elles sont de diffrents types. [Link]();
60
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Smantique d'hritage: Polymorphisme
Le polymorphisme est le fait qu'une classe peut avoir plusieurs sousclasses.
Ex: Personne a comme sous-classes Etudiant et Enseignant.
Par principe de substituabilit, le programme qui traite les objets Personnes na pas besoin de distinguer les objets Etudiant de ceux d'Enseignant public class Afficheur { Personne[] personnes; . public void afficherToutePersonne() { for(int i=0; i<[Link]; i++) { personnes[i].afficher(); // affichage d'un Etudiant // et celui d'un Enseignant peuvent tre diffrents. } } }
61
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Interface: type abstrait
Une interface est un type abstrait, cens tre implment par des classes. Il ne contient que les mthodes sans corps. Ces mthodes sont redfinir dans les classes d'implmentation On ne peut pas crer une instance d'une interface mais on peut crer une instance d'une classe d'implmentation.
AdaptateurWifiImpl1 envoyerDonner(..) { .. } recevoirDonner(..) { .. } AdaptateurWifiImpl2 envoyerDonner() {.. } recevoirDonner(...) { .. }
<<Interface>>
AdaptateurWifi
envoyerDonner(..) recevoirDonner(..)
62
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Interface: hritage multiple
Une classe peut hriter de plusieurs interfaces.
Chaque interface reprsente un rle d'une classe. Ex. un Lecteur CD-DVD a comme rles LecteurCD et LecteurDVD
<<Interface>> <<Interface>>
LecteurCD lirePiste()
LecteurDVD selectionnerLanguage();
LecteurCdDvdImpl lirePiste(); selectionnerLanguage(...); .
63
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Interface: syntaxe
interface nom_de_l'interface [ extends noms d'autres interfaces ] { public void methode1(String param1) ; public int methode2(int param1, int param2) ; // autres mthodes }
Le mot cl "extends" permet une interface d'hriter d'autres interfaces (une ou plusieurs)
64
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Implmentation d'une interface
Une classe implmentant une interface doit redfinir toutes les mthodes dclares dans l'interface.
public class LecteurCdDvdImpl implements LecteurCD, LecteurDVD { public void lirePiste(int noPiste) { . // faire } public void selectionnerLangue(String lang) { . // faire } }
65
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Les classes abstraites
Une classe abstraite est incomplte
Elle ne peut tre utilis telle quelle. Elle est cense tre spcifie par des sous classes. On ne peut pas crer une instance d'une classe abstraite.
Une classe abstraite peut avoir des mthodes vides ( redfinir par des sous-classes).
66
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple d'une classe abstraite
public abstract Feneitre { // attributs gnriques pour tout type de fentres. int posX; int posX; int dimX; int dimY; // Les mthodes dont l'implmentation est gnrique // (pour tout type de fentres). public void deplacer() { } public void redimensionner(int newDimX, int newDimY) { dimX = newDimX; dimY = newDimY; rafraichirContenu(); } // la mthode dont on ne connat pas encore l'implmentation // (cela dpend de type de fentre). Ainsi on la laisse vide. public abstract rafraichirContenu(); }
67
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Visibilit: modificateur public/private
Le modificateur public marque que les attributs/ mthodes d'une classe sont accessibles partout (dans les classes). Le modificateur private marque que les attributs/ mthodes d'une classe ne sont accessibles que dans cette classe.
class C2 { void m3() { C1 c1 = new C1(); c1.a1 = "hello"; // OK // c1.a2 = "hello"; illgal c1.m1(); // OK // c1.m2(); illgal } }
68
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
class C1 { public String a1; private String a2; public void m1(); private void m2(); }
Visibilit : autre modificateurs de visibilit
Les autres modificateurs sont:
aucun modificateur (par dfaut): les attributs/ mthodes sont accessibles
par les classes du mme package
protected: les attributs/ mthodes sont accessibles
par les classes du mme package, et par les sous-classes de la classe courante.
package p1; public class A { int a1; protected int a2; } public class B { // a1, a2 accessible }
package p2; public class C { // a1, a2 non accessible } public class D extends A { // a1 non accessible // a2 accessible }
69
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Encapsulation : principe
// pas d'encapsulation public class Date { public int jour; public int mois; public int annee; } // modification illgale Date d1 = new Date(); [Link] = 30; [Link] = 2; [Link] = 2006;
Principle d'encapsulation :
Une classe devrait cacher des attributs et exposer ses mthodes au monde extrieur (aux autre classes)
Protger le contenu (les attributs) de la modification illgale Masquer les dtails internes de la classe simplification
70
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Encapsulation: Protection du contenu
public class Date { private int jour; private int mois; private int annee; public Date() { // initialis la date aujourd'hui } public boolean setDate(int j, int m, int a) { if( estDateValide(j, m, a) ) { jour =j; moi=m; annee=a; return true; } else { return false; } } }
Seule la modification valide est permise
71
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Encapsulation: Masque de dtails internes
public class Image { // squence d'octets au format propritaire private byte[] donnees; public void chargerDeFichier(File ficher) { // charger et convertir au format propritaire } public void afficher() { . // interprter le format propritaire. } }
L'utilisateur na pas besoin de connatre le format de donnes pour utiliser cette classe
72
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Membres statiques
Le modificateur static peut s'appliquer une mthode ou un attribut dune classe.
L'lment statique est partag par toutes les instances de la classe. Il est possible dy accder sans disposer dune instance, mais directement par la classe.
Ex : une mthode statique
public class Calculatrice { public static int valeurAbsolue( int i ) { if(i < 0) return -1 * i; return i; } }
// OK [Link]( [Link](-25) ); // pas besoin de faire cela: Calculatrice c = new Calculatrice(); [Link]( [Link](-25) );
73
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Membres statiques: Exemple
public class Test { static int comptoir = 0; // initialiser lors du chargement de la classe int id; public Test() { id = comptoir; // utiliser le comptoir comme identifiant d'objet comptoir ++; //incrmenter le comptoir chaque instanciation } public imprimerId() { [Link](id); } public static imprimerComptoir() { [Link](comptoir); } } public static void main(String[] args) { Test t1 = Test(); Test t2 = Test(); Test t3 = Test(); [Link](); // rsultat? [Link](); // rsultat ? [Link](); // rsultat ? [Link](); // rsultat ? }
Les mthodes statiques ne peuvent accder quaux attributs statiques.
74
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Dfinition de constants
Un constant peut tre dfini comme un attribut dune classe, avec dclaration <<static>> (partage par toutes les instances) et <<final>> (sa valeur est non modifiable) Par convention le nom d'un constant est tout en majuscules.
public class MesConstants { public static final int LOAD = 0; public static final int SAVE = 0; public static final int MOVE = 2; }
75
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exception
Une exception reprsente un problme produit lors de l'excution. Ex.
NumberFormatException
[Link]("vingt trois"); // un problme
Une application robuste doit pouvoir grer des exceptions. Scnario d'utilisation
1) Une exception cre et jete (par un module d'appli. Ex, classe C1) 2) Une exception est saisie et traite (par un autre module appli. Ex, classe C2)
76
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple d'une exception
public class FileLoader { public static byte[] load(String fileName) throws FileNotFoundException { if() { // si le fichier inexistant throw new FileNotFoundException(fileName); } // chargement normal } } public class MonAppli { public static void main(String[] args) { String fileName = ; try { // tentative d'une opration susceptible de gnrer une exception byte[] contenu = [Link](fileName); print(contenu); } catch(FileNotFoundException e) { // traitement d'une exception [Link](e); } } }
77
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Dfinition des types d'exceptions
On peut dfinir diffrents types d'exception.
Ex: appli scurise:
AuthentificationFailedException, InvalidUserNameException, InvalidePasswordException.
Un type d'exception : une classe hritant de [Link]. On peut dfinir des attributs pour reprsenter l'info spcifique un type d'exception
public class AutentificationFailedException extends Exception { // information sur la date de la tentative de l'authentification et le nom de utilisateur [Link] date = new Date(); String userName; public AutentificationFailed(String userName) { [Link] = userName } } public class InvalidUserNameException extends AuthentificationFailedException { public InvalidUserNameException(String userName) { super(userName) } }
78
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
La dclaration <<throws>>
La dclaration <<throws>> marque quune mthode est susceptible dmettre une exception. La mthode peut produire une exception elle-mme (avec oprateur <<throw>>) ou faire passer une exception produite par une autre mthode
public class LoginManager { public void login(String userName, String password) throws AuthentificationFailedException, ConnectException { . throw new InvalidUserNameException(userName); } } public class TransactionManager { public void doTransaction() throws AuthentificationFailedException, ConnectException { [Link](userName, password); . } }
gnratrice de l'exception
Appelle
faire passer l'exception
79
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Trace d'une exception
La trace d'une exception informe sur l'origine de l'exception
Facilit de dbuggage Chane d'appels : [Link]() [Link]() [Link] throw new InvalidUserNameException()
Elle est une chane d'appels de mthodes
de la mthode gnratrice de l'exception jusqu' la mthode main
Elle est stocke dans l'exception. Affichage de la trace :
catch(Exception e) { [Link](); }
Affichage : InvalideUserNameException : jlopez at [Link] (line 124) at [Link] (line 250) at [Link] (linge 78)
80
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Le traitement d'exception
try { } catch(ExceptionType1 e) { } catch(ExceptionType2 e) { }
81
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.1 : Hritage et redfinition de mthode
Implmenter une application avec des classes Personne, Etudiant, Enseignant et Afficheur.
Les classes Etudiant et Enseignant redfinissent la mthode <<afficher()>> de la classe Personne.
Un affichage d'un Etudiant et celui d'un Enseignant prennent les formes:
Etudiant : [nom] no : [noEtudiant] promo : [promo] Enseignant : [grade] [nom]
Question
Si on nutilisait pas le concept de la redfinition:
Comment pourrait-on raliser cette application (avec <<instanceof>>) ? Si on ajoute dans le futur d'autres sous-classes de Personne, y aurait-il un modificafication ?
82
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.2 (1/5) : Manipulation des liens entre des objets
Notre application gre le systme de ficher. Elle se base sur:
Classe Rpertoire
Un rpertoire a un nom. Un rpertoire peut contenir des lments qui sont soit des fichiers, soit des rpertoires
Classe Fichier
Un fichier a un nom et son contenu.
Attribut reprsentant le contenu d'un rpertoire
On constate que le fichier et le rpertoire ont des caractres communs
Les deux portent un nom. Les 2 peut tre contenus par un rpertoire. Ainsi on cre la classe Element reprsentant ces caractres communs
Element
Attribut reprsentant le rpertoire conteneur
A faire: Dfinir en Java les classes Ficher, Rpertoire et Element
Fichier
Repertoire
83
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.2 (2/5)
Dfinir les mthodes permettant de:
Modifier le nom d'un fichier / rpertoire Modifier le contenu d'un fichier Dplacer un fichier / rpertoire
Dans la classe Rpertoire, crire une mthode permettant d'afficher le contenu du rpertoire rcursivement. Ecrire une classe main pour tester cette appli.
Crer une arborescence de fichier Afficher cette arborescence La modifier. Afficher le rsultat
84
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.2 (3/5) : Scnario de test
move Projet Doc Affichage du rpertoire (tat initial) : DocInterne [R] Projet [R] Projet/Doc [F] Projet/Doc/[Link] : "contenu du [Link]" [F] Projet/Doc/[Link] : "contenu du [Link]" [F] Projet/Doc/[Link] : "contenu du [Link]" [R] Projet/Doc/DocInterne [R] Projet/src [F] Projet/src/[Link]: "class Class1 {}" [R] Projet/bin [F] Projet/bin/[Link]: "010000111" [R] = Rpertoire [F] = fichier
erreur attendue (boucle)
rename Projet/Doc/[Link] move Projet/Doc Projet/src
erreur attendue (conflit de noms)
move Projet/src/Doc/[Link] rename Projet/src/Doc/[Link] move Projet/src/Doc/[Link]
erreur attendue (conflit de noms)
Projet/src [Link] src src
moveReplace Projet/src/Doc/[Link]
crasement attendu
85
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.2 (4/4) IHM
Crer la class IHM permettant l'utilisateur d'interagir avec le systme via les mthodes suivantes
void move(String cheminSource, String cheminDestination, boolean canReplace); void rename(String chemin, String nouveauNom);
86
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.2 (5/5) : Manipulation d'exception
Ajouter la manipulation des exceptions dans le systme de fichiers (TP prcdent). Dfinir les types d'exceptions suivantes :
InvalidName : l'utilisateur tente de nommer un fichier/ rpertoire avec des caractres non valides ( / \ : < > ? * |) ou la longueur du nom excde 20 caractres. NameConflict : l'utilisateur tente de nommer un fichier avec un nom dj pris par un des lments dans le mme rpertoire OwnershipViolation : l'utilisateur tente de dplacer un rpertoire dans un rpertoire successeur.
L'information que doivent porter les exceptions :
InvalideName, NameConflict : le nom causant le problme OwnershipViolation : la tentative de dplacement (le rpertoire dplacer et le rpertoire destinataire)
Faire un scnario de test pour chaque cas d'exception
87
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.3 (1/4) : Ralisation des interfaces du mcanisme d'vnements
Le mcanisme d'change d'vnements est trs utilis dans les applications d'aujourd'hui. Ce mcanisme se base sur 3 rles:
Linterface Sujet dfinit le rle des objets qui peuvent mettre des vnements. Linterface Observateur dfinit le rle des objets dsirant recevoir des vnements Linterface Evenement dfinit les objets contenant chacun une information quelconque (selon le type d'vnement) Le sujet offre une mthode pour inscrire des observateurs. L'observateur offre une mthode pour tre notifie lorsquun vnement est mis.
A faire: dfinir les interfaces Sujet, Observateur, Evenement
88
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.3 (2/4) : Implmentation gnrique
On souhaite implmenter cette application de manire gnrique avec la classe abstraite SujetAbstrait.
Elle implmente le mcanisme pour maintenir la liste des Observateurs inscrits ce sujet Elle offre la mthode (non abstraite) : void diffuserEvenement(Evenement ev);
Cette mthode sera utilise par les classes spcialistes pour diffuser des vnements quelconques.
89
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.3 (3/4) : Application sur le ebusiness
Notre application est compose de
Les classes FournisseurA, FournisseurB, FournisseurC reprsentent diffrents fournisseurs de produits dans le march. Elles prennent le rle de Sujet. Elles mettent des vnements sur des offres de produits. Chaque fournisseur offre un diffrent produit. Les classes MagasinA et MagasinB ont le rle d'Observateur. Elles souhaitent recevoir des offres de produits. Lorsquelles reoivent des offres, elles affichent
[MagasinB/ MagasinB] recu l'offre [nomProduit, prix, tempsLivraison] [accepte/ rejete] MagasinA accepte les produits moins chers que 100 euros. MagasinB accepte les produits livrables dans 7 jours maxi.
La classe OffreProduit a le rle d'vnement. Elle contient l'information sur le nom du produit, le prix, le temps de livraison.
A faire: Implmenter ces classes.
Utiliser la classe SujetAbstrat
90
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 4.3 (3/4) : Test
Dfinir un scnario de diffusion d'offres
Dans les classes FournisseurA, B, C dfinir la mthode : public void diffuserToutesOffres() { // ici on diffuse toutes les offres en rptant l'appel la mthode // diffuserEvenement() hrit de la classe SujetAbstrait }
Faire la classe main qui configure l'inscription des magasins auprs des fournisseurs et excuter le scnario
91
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
5. Tableaux, collections et Map
92
Tableaux
Un tableau est une squence d'lments
Squence de donnes primitives
Ex. int[], char[], byte[]
Squence de rfrences vers objets
Ex. Object[], Personne[]
On cre un tableau l'avec l'oprateur <<new>>
Ex.
int[] tab1 = new int[10]; int dim = 20; Object[] tab2 = new Object[dim];
Pour un tableau dobjets, initialement ses lments sont <<null>>
Un tableau est lui-mme un objet On accde aux lments du tableau avec un index (entre 0 jusqu' la dimension -1) On peut connatre la dimension du tableau par son attribut <<lenght>>
93
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Un tableau est un objet
On peut affecter un tableau au variable de type [Link]
Object o = new Personne[20];
On peut dcouvrir le type du tableau
[Link](o instanceof Personne[]); // rsultat : true [Link]([Link]().isArray()); // rsultat : true [Link](o. getClass().getComponentType().getName()); // rsultat : Personne
94
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Tableaux : redimension
La dimension du tableau est fixe lors de la cration de l'objet (new) Pour redimensionner, il faut :
1) Crer un nouveau tableau d'une nouvelle dimension 2) Copier les lments de l'ancien tableau vers le nouveau
Astuce: [Link]( source, position, destination, position, nombreElements );
Ex. public static Object[] redimentionner(Object[] tab, int nouvelleDim) { Object nouveauTab = new Object[nouvelleDim]; int dimMin = (nouvelleDim> [Link])? [Link] : nouvelleDim; [Link](tab, 0, nouveauTab, 0, dimMin); }
95
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Un tableau de tableaux
Quel est le tableau rsultat de ce programme?
int[ ][ ] tab2dim = new int[5][ ]; // cration de tableau dimension 5 pour stocker des tableaux de <<int>> for(int i=0; i<[Link]; i++) { tab2dim[i] = new int[i+1]; // creation d'un tableau de int for(int j=0; j< tab2dim[i].length; j++) { tab2dim[i][j] = j; } }
1 1 1 1 1 2 2 2 2 3 3 3 4 4 5
96
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Collections
Une collection manipule un ensemble d'objets Elle possde des mthodes pour :
Ajouter/supprimer un objet dans la collection Obtenir les objets dans la collection
Plusieurs variations
Une collection ordonne une liste Une collection filtrant la duplication des membres un ensemble
Un ensemble ne peut pas contenir le mme objet plus dune fois.
97
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Les collections prtes utiliser en Java
Le package [Link] offre des implmentations des collections prtes utiliser Linterface Collection dfinit les mthodes, par ex :
boolean add(Object o) : ajouter un objet dans la collection int size() : consulter la taille de la collection iterator() : itrer dans tous les membres de la collection. Pendant l'itration, la collection ne doit pas tre modifie (pas ajout/suppression de membres) boolean contains(Object o) : tester si l'objet existe dans la collection. La comparaison d'objets se fait par la mthode equals().
Linterface List : des collections ordonnes (listes). Elle dfinit des mthodes spcifiques aux listes, par ex :
void add(int index, Object element) : ajouter un objet dans l'index specifi. public Object remove(int index) : retirer l'objet l'index spcifi
Les classes Vector, ArrayList sont des implmentations de List. La classe HashSet est une implmentation de Collection. Elle filtre la duplication de membres.
Il n'existe pas deux objets o1 et o2 tels que <<[Link](o2)>> dans l'ensemble.
98
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Collection de donnes primitives
On a vu que les membres de collections sont des objets et non des donnes primitives (int, char, double) Afin de mettre des donnes primitives dans une collection, on utilise la forme d'objets
int class [Link] char class [Link] double class [Link]
Ex.
Collection c = new Vector(); [Link](new Integer(3)); [Link](new Integer(2)); [Link]( [Link](new Integer(3)); // true
99
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Copier une collection
En gnral, les constructeurs des classes d'implmentation de collections (Vector, ArrayList, HashSet) prennent comme paramtre une collection source pour crer une copie.
Ex. List v = new Vector(); [Link]("a"); [Link]("ab"); List copie = new Vector(v); [Link]("abc"); [Link](v); // rsultat : [ a, ab ] [Link](copie); // rsultat : [ a, ab, abc ]
Il est possible d'utiliser un tel constructeur pour convertir entre plusieurs variations de collections
un ensemble vers une liste : dans un ordre quelconque une liste vers un ensemble : la duplication est ignore
100
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Conversion entre tableaux et collections
Tableau vers collection
utiliser la classe [Link] mthode : public static List asList(Object[] tab) Attention <<Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.)>> Afin d'obtenir une collection indpendante du tableau, crer une copie de la liste retourne par [Link]() Ex.: Object[] tab = ; List l = new Vector([Link](tab));
Collection vers tableau
Collection c = ; Object[] tab = [Link](); String[] tab2 = (String[]) [Link](new String[[Link]])); // obtenir un tableau d'un type spcifique
101
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Trier une liste
La classe [Link] propose les mthodes pour trier une collection.
static void sort(List list) : tirer une liste d'objet implmentant l'interface <<Comparable>> static void sort(List list, Comparator c) : trier une liste d'objet en utilisant un comparateur personnalis
interface Comparable :
propose la mthode : int compareTo(Object o); // retourne un nombre ngatif, 0, nombre positif si infrieur de, gal , suprieur Les objets basiques (Integer, String, Byte, Char, ) implmentent Comparable
interface Comparator :
propose la mthode : int compare(Object o1, Object o2)
102
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Paramtrage de la collection (Java 1.5)
Java 1.5 permet au programmer de spcifier le type d'objets qui sont membres de la collection. Avantages
Code plus lisible. Plus besoin de faire casting
Ex. for(Iterator it =
Dtection d'erreurs lors de la complication (Ex. ajout d'objets de mauvais type dans la collection) // Java 1.5 List<String> v = new Vector<String>(); [Link]("a"); [Link]("b"); [Link](new Integer(3); // erreurs de compliation for(int i=0; i<[Link](); i++) { String s = [Link](i); [Link](i, "prefix_" + s ); } // Java 1.4 List v = new Vector(); [Link]("a"); [Link]("b"); [Link](new Integer(3); // pas d'erreurs de compliation for(int i=0; i<[Link](); i++) { String s = (String) [Link](i); // produire erreur d'excution (ClassCastException Integer to String) [Link](i, "prefix_" + s ); }
103
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Map
Un map (objet implmentant l'interface [Link]) reprsente un ensemble de couples <cl, valeur>. Les cls et valeurs peuvent tre des objets de type quelconque. Il propose les mthodes :
void put(Object key, Object value) : ajouter un couple <cl, valeur> dans le Map. Sil existe dj un couple avec cette cl, le nouveau remplace l'ancien. Object get(Object key) : trouver la valeur associe une cl. Object remove(Object key) : retirer le couple <cl, valeur> s'il existe. retourner la valeur retire. Set keySet() : obtenir toutes les cls existant dans le map.
Classes [Link], [Link] : implmentations de l'interface Map Classe [Link] : une implmentation de Map dont les cls et les valeurs sont des String.
104
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Table de hachage (Hashtable)
La table de hachage est une technique d'implmentation de Map Un tableau de grande taille est utilis pour stocker les couples <cl, valeur> Le hachage de la cl permet de trouver l'index du tableau pour stocker le couple/ rechercher le couple.
stocker les couples dont leurs cls entre 0 99 cls entre 100 - 199 Hachage : cls entre 200 - 199 l'index de 5 0 l'index de 105 1 l'index de 145 1 l'index de 213 2
105
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Les objets cls doivent redfinir la mthodes equals(..) et hashCode()
boolean equals(Object uneAutreCle)
Permet de tester si cette cl est gale une autre cl.
int hashCode()
Permet de trouver l'index du tableau associ cette cl. Contrat respecter : si deux cls sont gales, elles doivent retourner le mme index de hachage.
Les classes standards (String, Integer, Double ) proposent dj l'implmentation de ces mthodes.
106
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple d'utilisation incorrecte de Hashtable
Problme de programmation
int[] key1 = { 1, 2, 3 }; int[] key2 = { 1, 2, 3 }; Map m = new Hashtable(); [Link](key1, "valeur de 123"); [Link]( [Link](key1) ); //afficher <<valeur de 123>> [Link]( [Link](key2) ); //afficher <<null>> [Link](key2, "nouvelle valeur de 123"); [Link]( [Link](key1) ); //afficher <<valeur de 123>> [Link]( [Link](key2) ); //afficher <<nouvelle valeur de 123>> [Link]( [Link]() == [Link]()); // afficher <<false>> [Link]( [Link]([Link]()); // afficher <<false>>
Les objets tableau ne proposent pas de bonne implmentation de equals() et hashCode()
Ainsi key1 et key2 sont considres comme ingales les couples <key1, > et <key2, > sont stocks dans deux index diffrents
107
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Redfinition de la mthode equals() et hashCode()
public class IntArray { // une classe enveloppant un tableau pour redfinir les mthodes equals(..) et hashCode() private int[] tab; public IntArray(int[] tab) { [Link] = tab; } public boolean equals(Object o) { if(this==o) return true; if(! (o instanceof IntArray) ) return false; IntArray ia = (IntArray) o; if(tab[].length != [Link][].length) return false; for(int i=0; i<[Link]; i++) { if(tab[i] != [Link][i]) return false; } return true; } public int hashCode() { // Deux objets IntArray gaux retournent le mme index. int somme = 0; for(int i=0; i<[Link]; i++) { somme=+tab[i]; } return somme; } }
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
108
Correction du problme
int[] key1 = { 1, 2, 3 }; IntArray key1 = new IntArray(tab1); int[] key2 = { 1, 2, 3 }; InArray key2 = new IntArray(tab2); Map m = new Hashtable(); [Link](key1, "valeur de 123"); [Link]( [Link](key1) ); //afficher <<valeur de 123>> [Link]( [Link](key2) ); //afficher <<valeur de 123>> [Link](key2, "nouvelle valeur de 123"); [Link]( [Link](key1) ); //afficher <<nouvelle valeur de 123>> [Link]( [Link](key2) ); //afficher <<nouvelle valeur de 123>> [Link]( [Link]() == [Link]()); // afficher <<true>> [Link]( [Link]([Link]()); // afficher <<true>>
109
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 5.1 : Manipulation de tableaux
Implmenter un programme cherchant un Objet dans un tableau
mthode : int chercher(Object s, Object[] tab) retourner l'index si trouv (sinon retourner -1)
Tester ce programme avec cette mthode main :
public static void main(String args) { Object[] tab = { "a", null, "ab", null, '"abc", "abcd" }; // initialisation d'un tableau [Link]( chercher("ab", tab) ); [Link]( chercher("xyz", tab) ); }
110
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 5.2 (1/1) : Manipulation de listes
Ecrire un programme permettant d'inverser l'ordre des membres d'une liste, sans modifier la liste originale
public List inverser(List org)
Ecrire un programme permettant d'inverser une liste en modifiant la liste originale
public void inverserModif(List org)
Ecrire un programme permettant de filtrer des membres de collections (de type Integer) qui sont infrieur 0.
public Collection filtrer(Collection intCollection)
111
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 5.2 (1/2) : Manipulation de listes
On propose l'interface Filtre permettant de dfinir un filtre personnalis :
public interface Filtre { public boolean estFiltre(Object o); // vrai si l'objet est filtrer }
Ecrire un programme permettant de filtrer une collection avec un filtre personnalis
public void Collection filtre(Collection c, Filtre f)
Ecrire une classe d'implmentation de filtre (classe FiltreIntPair) pour filtrer des objets de type Integer
Les nombres impairs sont filtrs
Ecrire un programme prenant en arguments de ligne de commande une liste filtrer
Ex. java poo.tp5_3.MainClass 2 4 6 13 15 17 20 Astuce: en Eclipse, on spcifie les arguments de ligne de commande avec le menu Run Run l'onglet Arguments
112
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 5.3 : Map multivalu
Crer un map permettant dassocier une cl plusieurs valeurs. Le principe consiste utiliser le map <<normal>> associant une cl une liste de valeurs. Implmenter la classe MultivalueMap
public class MultivalueMap { Map<Object, List> map = new Hashtable<Object, List>(); // un map normal public void put(Object key, Object value) { } public List get(Object key) { } public List remove(Object key) { } // supprimer toutes les valeurs associes la cl et retourner les valeurs supprimes. public boolean remove(Object key, Object value) { } // supprimer une seul valeur retourner vrai si la valeur a exist (et donc a t supprime) }
Est-ce que la modification de la liste retourne par la mthode get() affecte les donnes stockes dans le map? Proposer l'implmentation de get(..) qui empche cela. Appliquer ce map pour stocker l'info sur les tudiants et leurs cours. Ex :
put ("000123", "Systmes I" ) : tudiant no 000123 prend le cours "Systmes I" put ("000123", "OOP") : cet tudiant prend galement le cours OOP put ("000124", "Anglais I" )
Ajouter la mthode affichant tous les couples du map sous forme d'une table.
L'affichage doit respecter l'ordre descendant des numros d'tudiants.
113
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 5.4 (1/2) : Map de donnes les plus rcemment utilises
Crer la classe <<CacheMap>> proposant les comportements suivants:
Elle a une capacit de stockage limite ( configurer lors de l'instanciation de la classe). Elle ne peut stocker que N couples. Lors qu'elle atteint sa capacit et que le programmeur tente dajouter un nouveau couple, elle supprime le couple le moins rcemment utilise (LRU: Least Recently Used). Pour identifier le couple LRU, elle maintient le classement de ces cls selon lordre daccs (via put/get)
CacheMap hrite de la classe Hashtable et redfinit certaines de ses mthodes.
114
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 5.4 (2/2) : Scnario de teste
public static void main(String[] args) { CacheMap m = new CacheMap(1000) ; // capacit 1000 for(int i=0; i<10000; i++) { [Link](new Integer(i), new Integer(i * 2)); [Link](34); } [Link]("la Map est de taille : " + [Link]() ) ; // attendu : 1000 [Link]("la valeur de 9956 est : " + [Link](new Integer(9956)); // attendu : 2 fois 9956 [Link]("la valeur de 35 est : " + [Link](new Integer(35)); // attendu : null [Link]("la valeur de 34 est : " + [Link](new Integer(34)); // attendu : 2 fois 34. }
115
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
6. Manipulation des Entres/ sorties
flux et fichiers
116
Les entres-sorties
Le package [Link] permet de grer la manipulation dentres / sorties. Les entres et les sorties sont des flux de donnes
flux entrants : le programme peut lire les donnes. flux sortants : le programme peut y mettre des donnes.
Source de donnes
Un flux connecte un programme avec une sources de donnes Ex. cran/clavier, fichiers, connexion TCP/TP, Web
Web Programme
fichier
117
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Flux abstraits
Abstraction
Permet au programme de lire/crire des donnes de diffrentes sources de donnes de la mme manire. Ex. On peut utiliser le mme code pour lire des fichiers et des pages web.
Classe abstraites
[Link]/ [Link] : flux entrant/ sortant pour donnes brutes (octets) [Link]/ [Link] : flux entrant/ sortant pour donnes textes uni codes (16 bits)
Exception
[Link] : reprsente des problmes de la connexion de flux
Dpendant des sources d donnes : Fichiers, Web
118
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Flux d'octets
InputStream propose les mthodes:
int read() : lire un octet (retourn en int), -1 si le flux est termin. int read(byte buf[]) : lire une squence d'octets et la mettre dans buf, retourner un nombre d'octets lus (entre 0 et [Link]), -1 si le flux est termin. close() : fermer le flux, librer des ressources associes.
OutputStream propose les mthodes:
void write(int b) : crire un octet (reprsent avec int) dans le flux void write(byte buf[]) : crire une squence d'octets dans le flux. flush() : Si la mmoire tampon est utilise, envoyer toutes les donnes de la mmoire tampon vers la destination. close() : terminer l'criture sur la source de donnes.
119
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Flux de caractres
Reader propose les mthodes:
int read() : lire un caractre (retourn en int), -1 si le flux est termin. int read(char buf[]) : lire une squence de caractres et la mettre dans buf, Retourner un nombre de caractres lus (entre 0 et [Link]), -1 si le flux est termin. close() : comme InputStream
Writer propose les mthodes:
void write(int c) : crire un caractre (reprsent avec int) dans le flux void write(char buf[]) : crire une squence de caractres dans le flux. flush() : comme OutputStream close() : comme OutputStream
120
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Flux concrets
les classes abstraites InputStream/ OutputStream et Reader/ Writer sont spcialiser pour reprsenter des flux concrets Exemple de flux d'octets
FileInput(Output)Stream : lire/ crire des fichiers ByteArrayInput(Output)Stream : lire/ crire des octets dans un tableau via les mthodes de InputStream/ OutputStream ObjectInput(Output)Stream : lire et crire des objets dans un flux quelconque (fichiers, rseaux)
Exemples de flux de caractres
FileReader(Writer) : lire/ crire des fichiers textes StringReader(Writer) : lire/ crire des caractres dans un String via les mthodes de Read/ Writer.
121
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple : lecture/criture de fichers
import [Link].*; public class Copy { public static void main(String[] args) throws IOException { FileReader in = new FileReader("c:/[Link]"); FileWriter out = new FileWriter("c:/[Link]"); int c; while ((c = [Link]()) != -1) { [Link](c); } [Link](); // dverrouiller (lecture seule) le fichier [Link](); // crire les donnes de la mmoire tampon vers le fichier et le fermer } }
122
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Lecture bloquante / non bloquante
La lecture de donnes du flux peut engendrer un dlai
Ex. Congestion de rseaux.
Le programme peut effectuer la lecture de deux manires
Bloquante : le programme attend jusqu' ce que les donnes soient disponibles
[Link](), [Link]() : le programme ne sort de ces mthodes que quand un octet / caractre est prt retourner
Non bloquante : le programme obtient uniquement les donnes actuellement disponibles
[Link](byte[] buf), [Link](char[] buf) : Si les donnes ne sont pas encore disponibles, alors la mthode retourne 0 comme le nombres d'octets/ caractres lus.
123
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Emballage (wrapping) de flux
Certains types de flux peuvent emballer un autre flux. Ex.
BufferedInput(Output)Stream, BufferedReader(Writer) propose la gestion de mmoire tampon. Augmenter la performance Le programme lire/ crire des donnes sur la mmoire tampon. Ces donnes sont transfres de /vers le flux emball.
Les classes de flux qui peuvent emballer proposent un constructeur prenant comme paramtre le flux emballer Ex.
InputStream input = ; // flux entrant emballer BufferedInputStream in = new BufferedInputStream(input); OutputStream output = ; // flux sortant emballer BufferedOutputStream in = new BufferedOutputStream(output);
124
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Flux de connexion de rseaux
Lecture d'une URL
[Link] url = new URL("[Link] InputStream in = [Link]();
Flux TCP/TP
[Link] socket = new Socket(" [Link]", 80); InputStream in = [Link](); OutputStream out = [Link]();
125
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Manipulation de flux de caractres entrants La classe [Link] propose une mthode pratique pour lire chaque ligne de texte d'un flux emball (InputStream).
Ex.
InputStream in = new FileInputStream("c:/[Link]") BufferedReader br = new BufferReader(in); String ligne = [Link]();
Pour analyser la ligne lue, utiliser la classe [Link]
Ex.
StringTokenizer st = new StringTokenizer(ligne); while([Link]()) { String t = [Link](); [Link](t); }
126
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Manipulation de flux de caractres sortants
La classe [Link] propose des mthodes pratiques pour crire diffrents types d'information sous forme textuelle vers un flux emball (OutputStream).
Ex. print(int i), print(boolean b), print(String s), print(Object o) . println(int i), println(boolean b), println(String s), println(Object o).
Pour transformer un objet vers du texte [print(Object o)], la mthode toString() de l'objet est invoque. La classe de l'objet peut fournir l'implmentation de toString() pour proposer la reprsentation textuelle de l'objet. Ex.
Personne { String nom; public String toString() { return "Personne : " + nom; } }
OutputStream out = ; PrintWriter w = new PrintWriter(out); Personne[] tab = ; [Link]("Les membres de l'quipe") for(int i=0; i<[Link]; i++) { [Link](tab[i]); }
127
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Les flux dentre et de sortie standard
Le flux dentre standard : [Link] (instance de InputStream)
Par dfaut, la source de donne est le clavier
Flux standard de sortie (instance de PrintWriter):
[Link] : le flux sortant qui, par dfaut, saffiche lcran [Link] : le flux sortant pour les erreurs (qui, par dfaut, saffiche galement lcran )
128
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Connexion de deux modules de programme avec un tuyau (<<pipe>>)
Un programme peut tre divis en plusieurs modules. Chaque module effectue une tache parallle. Un tuyau permet la communication entre les modules.
un module permet d'envoyer des donnes un autre module par un flux.
Le module producteur : envoie des donnes par PipeWriter ou PipeInputStream Le module consommateur : renvoie les donnes par PipeReader ou PipeInputStream
Etablissement de connexion de modules
PipedWriter pipeOut = new PipedWriter(); PipedReader pipeIn = new PipedReader(pipeOut); // pipeOut est utlis par le producteur // pipeIn est utlis par le concomateur
Module producteur utilise PipeWriter ou PipeOutputStream
Module consommateur utilise PipeReader ou PipeInputStream
129
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Srialisation et reconstitution d'objets travers un flux
La classes ObjectInput(Output)Stream permettent de lire et crire des objets du programme Cas d'utilisation
Sauvegarder l'tat du programme dans un ficher pour pourvoir recharger plus tard Envoyer des objets d'un programme un autre programme.
Elle propose les mthodes
void writeObject(Object o) : crire un objet vers le flux. L'criture d'objet consiste crire l'tat de l'objet (tous les attributs) Object readObject() : reconstituer l'objet qui a t crit par writeObject().
Les classes des objets <<srialisable>> doivent implmenter l'interface [Link].
130
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple de la srialisation d'objets
// chargement d'un objet d'un fichier FileInputStream fin = new FileInputStream("c:/[Link]"); ObjectInputSteam oin = new ObjectInputStream(in)); Biblioteque biblio = [Link](); // on peut naviguer vers des livres et des adhrents et exemplaires public class Bibliotheque implements Serializable { List<Livre> livres; List<Adhrent> adherents; } public class Adhrent implements Serializable { String nom; } public class Exemplaire implements Serializable { int no; Adhrent emprunteur; // null signifie libre }
public class Livre implements Serializable { String nom; String auteur; List<Exemplaire> exemplaires; }
131
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple: Flux de donnes compresses
// From The Java Developers Almanac 1.4 // Files to include in the ZIP file String[] filenames = new String[]{"filename1", "filename2"}; // Create a buffer for reading the files byte[] buf = new byte[1024]; try { // Create the ZIP file ZipOutputStream out = new ZipOutputStream(new FileOutputStream("[Link]")); // Compress the files for (int i=0; i<[Link]; i++) { FileInputStream in = new FileInputStream(filenames[i]); // Add ZIP entry to output stream. [Link](new ZipEntry(filenames[i])); // Transfer bytes from the file to the ZIP file int len; while ((len = [Link](buf)) > 0) { [Link](buf, 0, len); } // Complete the entry [Link](); [Link](); } // Complete the ZIP file [Link](); } catch (IOException e) { }
132
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Manipulation de fichiers et rpertoires
La classe [Link] reprsente des fichiers et des rpertoires existants ou non (qui vont tre crs). Elle propose des mthodes suivantes pour manipuler les fichiers des rpertoires :
File(String pathname), File(String parent, String child) boolean exists() boolean canRead(), boolean canWrite() boolean delete(), boolean renameTo( File dest ) boolean isDirectory(), boolean isFile(), long length() boolean mkdir() File getParentFile(), File[] listFiles()
133
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 6.1 : Flux d'objets et srialisation
On souhaite crer une application permettant aux utilisateurs d'diter l'information dans une bibliothque. Elle accepte des commandes suivantes du clavier.
crer livre [nom] [auteur] [nombreExemplaire] crer adhrent [nom] emprunter [adhrent] [livre] retourner [adhrent] [livre] [noExemplaire] sauvegarder [nomFichier] : sauvegarder l'info sur un fichier. charger [nomFichier] : charger l'info depuis un ficher. arrter : arrter l'application
134
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 6.2 : Manipulation de fichiers et rpertoires
Crer une application qui ressemble une console. Elle propose les commandes suivantes pour manipuler les fichiers et rpertoires
pwd, cd [chemin complet ou relatif], cd .. dir mkdir [nom de rpertoire], rename [nom actuel] [nouveau nom] move [fichier/rpertoire] [chemin du rpertoire destinataire]. del [nom de ficher/rpertoire]. copy [fichier source] [fichier cible] view [fichier]
visualiser sur l'cran
135
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
7. Threads et synchronisation
La programmation concurrente, synchronisation, wait et notify. Problmes producteurconsommateur, lecteur-crivain
136
Thread
Un programme multithreads peut excuter plusieurs activits en parallle.
Ex. Application de tlchargement : plusieurs threads tlchargent des fichiers en parallle.
Un thread suit une squence d'instructions
137
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple : tlchargement parallle
Thread A : charger un fichier : "[Link]" while(p<100.00) { [charger un bloc de donnes] [afficher : fileName charg p% ] } [afficher : fileName chargement complet ] Thead B : charger un fichier : "[Link]" while(p<100.00) { [charger un bloc de donnes] [afficher : fileName charg p% ] } [afficher : fileName chargement complet ] Ecran : [Link] charg 3% [Link] charg 8% [Link] charg 5% [Link] charg 13% ..
138
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Dfinir ce que font des threads
Les classes hritant de [Link] ou implmentant l'interface [Link] spcifient le code que doivent excuter des threads.
redfinir la mthode run()
Un objet instance d'une telle classe reprsente un thread
public class MonThread extends Thread { String fileName; public void run() { // redfinition // le code } } instanciation
139
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Thread A : charger [Link]
Thread B : charger [Link]
Deux faons de dfinir un thread Faon 1 : Crer une classe hritant de la classe [Link] Faon 2 : Crer une classe implmentant l'interface [Link]
140
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Lancement de threads
Instanciation d'une classe dfinissant le thread.
MonThread t = new MonThread("[Link]", "Thread A"); Le constructeur est utile pour passer des donnes qui seront manipules par le thread Ex. passer le nom du fichier charger.
Si la classe est dfinie de la faon 1 (Thread)
[Link]();
Si la classe est dfinie de la facon 2 (Runable)
Crer un thread enveloppe et appeler start() Thread enveloppe= new Thread(t, "Thread A"); [Link]();
La mthode run() que vous avez dfinie sera excute par le systme en activit parallle.
N'appelez pas vous mme la mthode run() ! : Cela ne crera pas le paralllisme.
141
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple : lancement de thread chargeur de fichiers
public class MonThread extends Thread { String fileName; public MonThread(String fileName, String threadName) { super(threadName); [Link] = fileName; } public void run() { } public static void main(String[] args) { MonThread tA = new MonThread("[Link]", "Thread A"); MonThread tB = new MonThread("[Link]", "Thread B"); [Link](); [Link](); } }
142
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Dfinir une tache priodique
Exemple d'une tache priodique
Vrification de l'arrive de nouveaux mails
En gnral, une tache priodique pouse un comportement comme suit :
while(activated) { // faire quelque chose try { [Link](60000); // 60 secondes } catch(InterruptedException e) { } }
La mthode sleep(..) permet au thread courrant d'arrter l'excution pendant un temps spcifi (en milliseconde)
143
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Synchronisation : le problme
Quel problme peut se poser si plusieurs threads accdent aux mme donnes (objets) de manire concurrente?
write() Thread A read() Thread B public File { public byte read() { } public void write(byte[] b) { } } donne (fichier)
144
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Synchronisation : dfinition de section critique
La section critique est une section o un seul thread peut entrer chaque moment
Ex. Le corps des mthodes read(), write()
Deux approches pour dfinir la section critique
Faon 1 : Mettre le mot cl <<synchronized>> devant la mthode Faon 2 : Utiliser le block : synchronized(object) { . } // faon 1 public File { public synchronized byte read() { } public synchronized void write( byte[] b) { } } // faon 2 // A chaque fois de lire un fichier f synchronized(f) { [Link](); }
145
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Synchronisation : Exemple
Trois threads tentent excuter les sections critiques d'un mme objet en mme temps un seul thread peut y entrer chaque moment Thread 1 [Link](); entrer dans la mthode excuter la mthode finir la mthode objet : f Thread 2 Thread 3
[Link](); bloqu bloqu entrer dans la mthode excuter la mthode finir la mthode
[Link]() bloqu bloqu bloqu bloqu entrer dans la mthode excuter mthode finir la mthode
temps
146
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Coordination entre threads : Exemple de producteur-consommateur
On prsente ici une appli multi-thread qui a besoin de la coordination Cette appli est compose de:
Des threads "producteur" qui produisent des donnes et les mettent dans une file de messages. Des threads "consommateur" qui prennent les donnes de la file.
Cette appli ncessite la coordination suivante :
Les producteurs et les consommateurs ne doivent pas accder la file en mme temps (section critique) Quand la file est pleine : Les producteurs doivent attendre jusqu' ce qu'une place dans la file est libre. Quand la file est vide : Les consommateurs doivent attendre jusqu' ce qu'une donne est produite dans la file.
Producteurs
File de messages
Consommateurs
147
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Moniteur d'accs
Un moniteur d'accs propose des mthodes pour accder la file de manire contrle. Ces mthodes peuvent bloquer tant que les donnes ne sont pas prtes pour y accder.
public class Moniteur { private List file = new Vector(); // file de messages. public synchronized void Moniteur(int capacity) { } // crer un moteur pour une file d'attente de capacit spcifie public synchronized void put(Object o) { } // dposer une donne. bloquer si la file est pleine. public synchronized Object take() { } // prendre une donne. bloquer si la file est vide } // producteur while() { [Link](o); } // consommateur while() { [Link]( [Link]() ); }
148
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Les mthodes wait(), notify(), notifyAll()
Le moniteur d'accs a une responsabilit de bloquer/ dbloquer les threads
Les producteurs
Quand le file est pleine : Bloquer Quand il existent des places libres : Bbloquer
Les consommateurs
Quand la file est vide : Bloquer Quand il existent des donnes dans la file : Dbloquer.
Le moniteur d'accs contrle le blocage/ dblocage grce aux mthodes :
void wait() throws InterruptedException : Suspendre (bloquer) le thread courrant
Lors que le thread est suspendu, il laisse les autres threads entrer dans la section critique
void notify() : Rveiller (dbloquer) un des threads qui ont t suspendus void notifyAll() : Rveiller tous les threads qui ont t suspendus
Ces mthodes sont proposes par tous les objets Java ([Link])
149
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Implmentation du Moniteur d'accs
public class MoniteurProdCons { private List file = new Vector(); private int cap; public MoniteurProdCons(int capacity) { [Link] = capacity; } public synchronized void put(Object o) { while([Link]()==cap) { // tant que la file est pleine try { wait(); } catch(InterruptedException e){ } } [Link](o); notifyAll(); // notifier les consommateurs de la production d'une donne } public synchronized Object take() { while([Link]()==0) { // tant que la file est vide try { wait(); } catch(InterruptedException e){ } } Object o = [Link](0); notifyAll(); // notifier les producteurs de la libration d'une place dans la file return o; } }
150
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
MoniteurProdCons: Illustration
Cons1
print( [Link]()); Entrer dans la section critique La file est vide, donc le thread est suspendu print( [Link]() ); Entrer dans la section critique La file est vide, donc le thread est suspendu [Link](o1); Entrer dans la section critique La file devient { o1 }, Les threads suspendus sont notifis Finir la mthode Rveiller Rentrer dans la section critique L'objet o1 est retirer de la file et affich, la file devient vide Finir la mthode Rveiller Attendre de rentrer dans la section critique
Cons2
Prod1
Rentrer dans la section critique La file est encore vide, donc le thread est suspendu nouveau
temps
151
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple de lecteur-crivain
L'appli lecteur-crivain est un autre exemple de la coordination entre les threads. Elle est compose de
Un ensemble de threads qui peuvent lire et crire des donnes. Des lectures concurrentes sont permises Une criture est exclusive d'autres lectures et critures.
Lecteur 1 byte[1000] tableau
Ecrivain 1
Lecteur 2
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Ecrivain 2
152
Moniteur d'accs lecture-criture
public class MoniteurTableau { public synchronized void acquireReadLock() { } // demander le droit de lecture, bloquer si le tableau est en criture par un autre thread. public synchronized void acquireWriteLock() { } // demander le droit d'criture, bloquer si le tableau est en lecture/criture par d'autres threads public synchronized void releaseReadLock() { } // indiquer la fin de lecture public synchronized void releaseWriteLock() { } // indiquer la fin d'criture public byte read(int index) { } public void write(int index, byte b) { } } // lecteur Moniteur m = ; [Link](); for(int i=0, i<1000; i++ ) { byte b = [Link](i); } [Link](); // crivain Moniteur m = ; [Link](); for(int i=0, i<1000; i++) { [Link](i, (byte)2); } [Link]();
153
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Implmentation du moniteur
public class MoniteurTableau { Set lecteurs = new HashSet(); // la liste des lecteurs en cours Thread ecrivain = null; // l'crivain en cours public synchronized void acquireReadLock() { // attendre jusqu' ce que le tableau ne soit pas en criture par un autre thread while(ecrivain !=null) { try { wait(); } catch(InterruptedException e){ } } [Link]([Link]()); // inscrire un nouveau lecteur dans la liste } public synchronized void acquireWriteLock() { // attendre jusqu' ce que le tableau ne soit ni en lecture ni en criture par les autres threads while(ecrivain!=null || ! [Link]() ) { try { wait(); } catch(InterruptedException e){ } } ecrivain = [Link](); // inscrire l'crivain en cours } public synchronized void releaseReadLock() { [Link]([Link]() ); // enlever ce lecteur de la liste notifyAll(); // notifier les crivains en attente } public synchronized void releaseWriteLock() { ecrivain=null; // indiquer qu'il n'existe plus d'crivain en cours. notifyAll(); // notifier les lecteurs/ crivains en attente } // implmentation des mthodes read(), write() }
154
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Smaphore
Un smaphore est un moniteur d'accs qui maintient N jetons.
Un thread peut prendre un jeton du smaphore et puis le rendre au smaphore Lors que aucun jeton n'est libre, un thread demandeur de jeton sera bloqu jusqu' ce qu'un jeton soit libr.
La classe "smaphore" ressemble ceci:
public class Semaphore { public Semaphore(int n) { } // constructeur, crer un smaphore de 'n' jetons. public void acquire() { } // prendre un jeton, bloquer si aucun jeton n'est libre public void release() { } // rendre un jeton, et rveiller les threads en attente }
A vous d'essayer
Ecrire le code de la classe Semaphore
155
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Package [Link] (Java 1.5)
Java 1.5 propose maintenant les classes utilitaires pour manipuler la coordination entre les threads
[Link] : similaire au moniteur producteur-comsommateur prsent
Methodes : void put(Object o); Object take();
[Link] : similaire au moniteur lecture-criture prsent. [Link]
156
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 7.1 Producteur-consommateur
Illustrer la coordiation de thread dans une application de producteurconsommateur Crer une file de messages de capacit 5. Crer 2 producteurs (P1, P2) et 2 consommateurs (C1, C2)
P1 met un par un des objets Integer {1, 3, 5, 7, 9 } dans la file, et P2, {2, 4, 6, 8, 10}. A chaque production, le producteur affiche le message :
[P1/P2] met [objet]
C1 et C2 prennent chacun 5 objets de la file. A chaque consommation, le consommateur affiche le message :
[C1/C2] reu [objet]
NB. P1 et P2 devraient tre instances de la mme classe <<Producteur>>. Comment peut-t-on configurer ces composants pour qu'ils puissent mettre diffrents objets?
Expliquer le rsultat affich
157
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 7.2 : Lecteur crivain
Illustrer la coordination de thread dans une application de lecteur-crivain Complter la classe MoniteurTableau. Crer le scnario de test avec 2 lecteurs (L1, L2) et 2 crivains (E1, E2).
Afin de mieux illustrer le paralllisme, on retarde la dure de la lecture/ criture du tableau. C'est--dire que lon fait dormir le thread pour une dure d'une milliseconde chaque fois quun octet est lu ou crit. Plus prcisment, on ajoute l'instruction suivante entre la lecture/criture de chaque octet :
try { sleep(1); } catch(InterruptedException e) { }
L1 et L2 affichent le message <<[L1/L2] read lock acquired>> aprs l'appel acquireReadLock(), et affiche <<[L1/L2] releasing read lock>> avant l'appel releaseReadLock(). E2 et E2 affichent les messages similaires Expliquer le rsultat affich.
158
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 7.3 : Tlchargement de fichiers en parallle
Crer une application permettant de tlcharger des fichiers spcifis avec URLs en parallle
Utiliser la classe [Link] pour obtenir InputStream
Utiliser la mthode lecture bloquante - int read() [] - pour lire une donne octet par octet. Chaque block de 200 octets lus, afficher ce message :
[nom de thread] : 200 octets lus.
Crer un scnario de test avec 3 threads Question : Si on utilise un seul thread pour tlcharger 3 fichiers, l'application sera-t-elle plus ou moins rapide?
159
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
8. Manipulation des documents XML avec Java
160
XML (eXtensible Markup Language)
Recommandation W3C Un document XML reprsente des donnes structures sous forme d'un arbre.
Ex. reprsentation d'un livre avec XML
Interoprabilit
<?xml version="1.0" encoding="UTF-16"?> <book> <booktitle> Learning Java and XML </booktitle> <chapter> <number> 1 </number> <title> Introduction </title> <content> . </content> </chapter> <chapter> . </chapter> </book>
161
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Les technologies XML
Manipulation de base de documents XML : DOM, SAX Vrification du contenu de documents XML : DTD, Schma XML Transformation de documents XML vers d'autres documents: XSLT Liaisons entre documents XML : XLink, XPointer Requte sur documents XML : XQuery Echange et traitement de documents XML dans les systmes rparties : Web Services Applications spcifiques aux domaines : Quelques formats standards de documents XML
SMIL (Synchronized Multimedia Integration Language) MathML (Mathematical Markup Language) ICE (Information and Content Exchange)
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Plus d'info : [Link]
162
Prolog XML
Le prolog prend la forme :
<?xml version="1.0" encoding="UTF-16"?>
Il se localise au dbut du document XML Le document doit tre encod correctement d'aprs la dclaration dans le prolog
Valeur par dfaut : UTF-8
Ex. : Ces deux documents doivent tre encods diffremment dans le flux d'octets !
<?xml version="1.0" encoding="UTF-16"?> <book> </book> <?xml version="1.0" encoding="UTF-8"?> <book> </book>
163
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Un document XML est un arbre des balises
Les balises sont nommes.
Ex. <book>, <title>, <number>
Les balises ouvrante et fermante
Ex. <book> some content</book> On peut y mettre des sous balises.
Si entre les deux balises est vide courte
Ex. <book></book> <book/>
on peut utiliser la forme
Les balises doivent tre bien formes (ouverture/ fermeture)
Ex. <book> <name> </book> </name> Mal form
164
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Choix entre sous balise et attributs
Utilisation de sous balises
<?xml version="1.0"?>
Utilisation des attributs
<?xml version="1.0"?>
<message> <to>you@[Link]</to> <from>me@[Link]</from> <subject>XML Is Really Cool </subject> <text> How many ways is XML cool? Let me count the ways... </text> </message>
<message to="you@[Link]" from="me@[Link]" subject="XML Is Really Cool"> <text> How many ways is XML cool? Let me count the ways... </text> </message>
165
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Des textes entre des balises
<?xml version="1.0" encoding="ISO8859-1" ?> <message> (retourne de ligne) (tab) <to>you@[Link]</to> (retour de ligne) (tab) <from>me@[Link]</from> (retour de ligne) (tab) <subject>XML Is Really Cool</subject> (retour de ligne) (tab) <text> How many ways is XML cool? Let me count the ways... </text> (retour de ligne) </message>
Lors de la manipulation de documents XML, on vite de traiter des textes non significatifs (retour de lignes, tab etc) En terminologie XML, ces textes sont appels "PCDATA" (Parsed Character Data) Ils ne peuvent pas contenir ces caractres : < > ' "
A replacer :
< par < > par > & par & ' par ' " par "
166
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
D'autres caractres
Caractres non pars (CDATA)
On peut mettre n'importe quel caractre entre <![CDATA[ et ]]>
<script> <![CDATA[ function matchwo(a,b) { if (a < b && a < 0) then { return 1 } else { return 0 } } ]]> </script>
Des commentaires
<!-- This is a comment -->
167
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Espace de nom (<<namespace>>) XML
Comment distinguer deux balises portant le mme nom?
<name>John Smith</name> <name>Wall street</name> : person name : street name
Solution: utiliser le namespace
xmlns:ns1="[Link] .. <ns1:name>John Smith</ns1:name> xmlns:ns2="[Link] .. <ns2:name>Wall street</ns2:name>
Un namespace est dfini par un URI
Ex. [Link] [Link]
Un namespace est rfrenc par un alias
Ex. ns1, ns2
168
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple d'un document XML avec des namespaces
<f:table xmlns:f="[Link] <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
169
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Grammaire de documents XML
<book> <booktitle> Learning Web Services </booktitle> <birthday>12-01-1982</birthday> <chapter> <number> 1 </number> <title> What are Web Services? </title> <content> . </content> </chapter> </book>
Est-ce correct?
Besoin de dfinir quelles balises sont permises.
170
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Grammaire de documents XML : Deux approches
DTD
Simple Un DTD peut tre mis au dbut du document XML
Schma XML
Plus puissant, de plus en plus utilis. Un schma XML est lui-mme un document XML.
171
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Un exemple de DTD
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
172
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Un exemple de Schma XML
<?xml version="1.0"?> <xsd:schema xmlns:xsd="[Link] targetNamespace="[Link] xmlns="[Link] elementFormDefault="qualified"> <xsd:element name="note" type="notetype"/> <xsd:complexType name="notetype"> <xsd:sequence> <xsd:element name="to" type="xsd:string"/> <xsd:element name="from" type="xsd:string"/> <xsd:element name="heading" type="xsd:string"/> <xsd:element name="body" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
173
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Manipulation de documents XML en Java
Manipulation de documents XML
Analyser le contenu des documents.
Vrification du contenu, extraction d'information
Construire un document
W3C propose deux APIs pour manipuler les documents Java
DOM (Document Object Model) SAX (Simple API for XML)
Ces APIs ont t portes sur la plateforme Java
Packages: [Link], [Link]
174
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
8.1. SAX (Simple API for XML)
175
SAX
Programmation dirige par vnements
Evnements :
start A start H start G end A
Document XML
Traitement Parseur
176
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple d'vnements gnrs
<?xml version="1.0"?> <book> <booktitle> Learning Java and XML </booktitle> <chapter> <number> 1 </number> <title> Introduction </title> <content> . </content> </chapter> <chapter> . </chapter> </book>
start book, start booktitle, start chapter, start number, end number, start title, end title, start content, end content, end chapter, . end book
177
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Le parseur : [Link]
Mthodes pour configurer les traiteurs d'vnement.
void setContentHandler(ContentHandler handler)
Mthode pour commencer le parcours du document
void parse([Link] input) throws IOException, SAXException
L'objet InputSource peut tre construit en enveloppant l'objet [Link] ou [Link].
178
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Interface [Link]
On implmente l'interface ContentHandler pour traitement des lments. Les mthodes suivantes seront appeles lors du parcours d'un document XML :
Dbut et fin du document
void startDocument() void endDocument()
Dbut et fin de chaque lement
void startElement(String namespaceURI, String localName, String fullName, Attributes atts) void endElement(String namespaceURI, String localName, String fullName)
Dtection du texte entre des balises
void characters(char[] ch, int start, int length)
179
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Interface [Link] (en plus de dtails)
startElement() et endElement() : Les significations de ses paramtres
String namespaceURI : URI de l'espace de nom (ex. [Link] String localName : le nom de la balise sans l'espace de nom (ex. table, name, width, length) String fullName : le nom complet (ex. f:table, f:name, f:width, f:length) Attributes atts [pour startElement()] : une liste des attributs de cette lment. On peut consulter cette liste via l'API de [Link]
void characters(char[] ch, int start, int length)
Les caractres sont localiss dans le tableau <<ch>>. Ils commencent l'index <<start>> et ont pour longueur <<length>> Pour obtenir un String, on peut faire :
String s = new String(ch, start, length); // on obtient "African Coffee Table", "80", ou "20"
<f:table xmlns:f="[Link] <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
180
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Localisation des balises dans le document
Le parseur passe l'objet Locator au ContentHandler. Lors que le ContentHandler reoit un vnement, il demande la localisation de la balise concerne au Locator
1: setDocumentLocator(locator) Parseur 2: startElement() Locator ContentHandler
3: getLineNumber() getConsumeNumer()
181
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Traitement d'erreurs
XMLReader gnre des erreurs lors du parcours du document
methode void parse([Link] input) throws IOException, SAXException
Les erreurs peuvent tre :
Caractres non valides trouvs. Document XML mal form (manque de balises ouvrant / fermant) Problmes de E/S (IOException)
Si les erreurs sont dtectes, le parseur arrte le parcours du document et jette une exception. On peut afficher plus de dtails d'erreurs comme suit
} catch (SAXParseException spe) { [Link]("\n** Parsing error" + ", line " + [Link]() + ", uri " + [Link]()); [Link](" " + [Link]() ); } catch (Exception e) { [Link](); }
182
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Arrt du parcours
Arrter le parcours d'un document XML, c'est utile dans les cas suivants :
On trouve une erreur, donc inutile de parser plus loin On trouve une information qu'on recherche dans le document, puis on souhaite arrter le parcours.
Les mthodes de ContentHandler offrent le moyen de jeter des exceptions
startElement(..), endElement(..), characters(..) throws SAXException.
Lors que ContentHandler jette une exception, le parseur va arrter le parcours du document et ensuite jeter une exception par la mthode parse() parse(...) Appli Parseur vnement ContentHandler
SAXException
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
SAXException
183
Spcification de l'implmentation du parseur SAX
L'API SAX est un ensemble d'interfaces. Elle peut donc avoir diffrentes implmentations. La classe [Link] permet dinstancier un objet XMLReader avec une classe dimplmentation particulaire
static XMLReader createXMLReader() : utiliser la proprit Systeme "[Link]" pour identifier l'implmentation. static XMLReader createXMLReader(String className) : crer une instance de la classe d'implmentation spcifie.
NB. Les proprits systme peuvent tre configures de 2 faons
Ligne de commande (lors de lancement de l'appli)
Ajouter D[proprit]=[valeur]
En excution
[Link]("property1", "valeur1");
184
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Rcapitulatif : tape suivre
Crer une XMLReader
XMLReader r = [Link]();
Spcifier le ContentHandler
[Link](monContentHandler());
Parser
[Link](inputStream);
185
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 8.1 SAX
Yahoo! fournit un service de recherche web retournant le rsultat en format XML
Exemple d'une requte au Yahoo! Web Search
[Link] oDemo&query=java+xml&results=100
Examiner le document XML retourn. Ecrire un programme permettant de filtrer les rsultats plus rcents d'une date spcifie (D'aprs la balise <ModificationDate>).
Afficher toute info sur les rsultats retenus. NB. La date de modification est reprsente par une long
Modifier le programme prcdent pour qu'il arrte le parcours du fichier une fois que 10 rsultats sont retenus.
186
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
8.2. DOM (Document Object Model)
187
DOM
L'API DOM permet de naviguer dans un arbre XML et le modifier
Navigation Modification Document XML Document XML Srialisation
188
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Construction d'un arbre Programme
Les nuds dans un arbre XML
Document : le nud racine.
Il contient un fils unique de type Element
Element : une balise XML
Il peut contenir des Elments fils, des Attributs et des Textes
Attr : des attributs dans les Elments Text, CDATASection, Comment : des nuds reprsentant PCDATA, CDATA, et des commentaires, localiss entre des balises
Les Texts peuvent tre des retours de ligne, des tabs.
Node : un nud gnrique
Document, Element, Attr, Text, CDATASection, et Comment hritent de Node.
189
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Construction d'un arbre
La class [Link] permet de construire un arbre.
Un arbre est accessible partir de l'objet [Link]
Un DocumentBuilder peut-etre obtenu par le factory
[Link]().newDocumentBuil der()
Le DocumentBuilder propose les mthodes :
Document parse(InputStream in) : crer un arbre partir du flux XML Document newDocument() : crer un arbre vide
190
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Navigation
Document d = [Link](inputStream); // obtenir la balise racine. Element root = [Link](); // obtenir le nom de la balise [Link]() // obtenir des attributs dans une balise NamedNodeMap attMap = [Link](); for(int i=0; i<[Link](); i++) { Attr a = (Attr) [Link](i); [Link]( [Link]() +" : " +[Link]() ); } String value = [Link]("att1") //Une autre faon // obtenir des fils (Element, Text, CDATASection ou Comment ) NodeList nodeList = [Link](); for(int i=0; i< [Link](); i++) { Node n = [Link](i); if(n instanceof Element) { . } // sinon n peut tre instance de Text, CDATASection ou Comment }
191
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Navigation
On peut galement monter dans l'arbre
Element parent = (Element) [Link]();
On peut naviguer d'un lment vers le Document
Document doc = [Link]();
On peut naviguer
192
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Modification d'un arbre
// le document permet de crer des Element, Text, CDATASection, et commentaire Document doc = ; Element elem = [Link]("message"); Text text = [Link]("mon texte"); // ajouter ou supprimer un attribut dans une balise [Link]("attr1", "valeur1"); [Link]("attr2"); // ajouter ou supprimer un fils (Element/Text/CDATASection/Comment) dans un Element [Link](fils); [Link](nouveauFils, refFils); [Link](fils);
193
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Exemple : construction d'un arbre
Document doc = [Link](); Element message = [Link]("message"); [Link](root); Element to = [Link]("to"); [Link](to); Text toText = [Link]("me@[Link]"); [Link](toText); Element from = [Link]("from"); [Link]("from"); .
194
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Srialisation d'un arbre
La classe [Link] permet d'crire un arbre XML vers un texte.
public static void write(Element root, OutputStream out) throws Exception { Transformer transformer = [Link]().newTransformer(); DOMSource domSource = new DOMSource(root); [Link](domSource, new StreamResult(out)); }
195
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Spcification de l'implmentation de DOM
Comme SAX, l'API DOM est un ensemble d'interfaces. Il peut donc avoir diffrentes implmentations. La classe [Link] permet dinstancier un objet DocumentBuilder avec une classe dimplmentation particulaire.
[Link]( "[Link] ", "[une classe d'implmnation]"); DocumentBuilder builder = new DocumentBuilderFactory().newInstance(). newDocumentBuilder();
196
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Rcapitulatif : analyser un document XML
Obtenir DocumentBuilder
DocumentBuilder builder = DocumentBuilderFactory().newInstance().new DocumentBuilder();
Parser un document XML
Document d = [Link](inputStream);
Naviguer dans l'arbre
197
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Rcapitulation : criture d'un document XML
Obtenir DocumentBuilder
DocumentBuilder builder = DocumentBuilderFactory().newInstance().newDocum entBuilder();
Crer un arbre vide
Document d = [Link]();
Crer des fils et les mettre dans l'arbre Srialiser l'arbre
write(rootElement, outputStream);
198
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Comparaison entre SAX et DOM
SAX
Traitement par vnements : les traiteurs d'vnements sont appels par le parseur. Capable de traiter un trs grand document : le document n'est pas gard dans la mmoire en intgralit. Pas possible de revenir sur les lments du pass.
DOM
Traitement par navigation : un arbre est d'abord construit. Ensuite, le programme y navigue. Pas optimal pour le grand document : le document doit tre intgralement charg dans la mmoire. Possible de naviguer dans tous les sens.
199
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
TP 8.2 DOM
Modifier l'appli de bibliothque (TP 6.1) pour supporter la sauvegarde et le chargement de donnes en format XML comme suit :
<?xml version="1.0"?> <Bibliotheque> <Livre nom="" auteur=""> <Exemplaire no="1" emprunteur="adherent1" /> <Exemplaire no="2" /> </Livre> . <Adherent id="adherent1" name="Jennifer Lopez" /> </Bibliotheque>
200
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich