Home

Table des matières

image

Contents

1. Mauhly Relation mise en place par addActionListener Pour remettre jour le mod le fe JFrame pi p2 p3 JP an quit JPanel JPanel JButton j nom Force l JList JTextField JLabel ame amure JButton _JButton_ vie JLabel Le graphique 9 3 G rer les v nements le mod le par d l gation 171 Figure 9 19 Diagramme de s quence de mise en place 1 Le 15 25 m Mauhly affreux JTextField en ChangeName 2 JTextFie d affreux 3 ChangeName m 4 addActionListener cn Figure 9 20 Diagramme simplifi d activation main nom JTextField e ActionEvent ChangeName Mauhly 1 postActionEvent Cet appel est r alis par le processus de diffusion d v nement Vision simplifi e ici 2 fir AtionPerformed lt _ 3 ActionEvent nom int toto 4 actionP rformed e Voici le code complet du programme import java util import javax swing import java awt import java awt event 5 setNom toto 172 Le graphique class Quit implements ActionListener public void actionPerformed
2. La construction de l arbre lui m me est triviale Il faut cr er les composants primitifs et les noeuds Chaque noeuds dispose de m thodes add Component c conform ment au mod le par composition Il suffit donc d enregistrer les composants dans les composites La figure 9 5 donne le diagramme de s quence pour construire l arbre Figure 9 5 Construction de l arbre mir f Frame pi Panel nom Label vie Label force Label 1 Frame Cr ation des composants Appel des constructeurs 2 Pand L Cr ation des liens 3 add p1 p re fils de l arbre 4 Label nom 5 Label vie i 6 Label force 7 add nbm 8 add vie i 9 add farce Enfin le code java est quasiment automatique import java util import java awt class Main public static void main String args Mauhly m new Mauhly affreux 15 25 mise en place du mod le 156 Le graphique m setArme new Arme 5 m setArmure new Armure 8 m addEquip new Arme 7 m addEquip new Armure 2 Frame f new Frame mise en place de la fen tre principale f setBackground Color blue MW ss Noeud pour Nom vie force Panel pl new Panel pl setBackground Color cyan pl add new Label Nom m getNom pl add new Label
3. GridLayout from awt BorderLayout from awt Chaque conteneur va donc tre associ a un algorithme de placement algorithme qui est repr sent sous forme d un objet impl mentant l interface LayoutManager La figure 9 8 montre le diagramme de classe faisant apparaitre les relations entre les conteneurs linter face LayoutManager et les algorithmes de placement situ dans les classes BorderLayout GridLayout Ce diagramme montre un bel exemple de d l gation Le conteneur d l gue le placement des objets qu il contient une instance de LayoutManager Si on inspecte la m thode do Layout du conteneur elle repose sur la d finition de la m thode abstraite layoutContainer de l interface LayoutManager public class Container extends Component public void doLayout layout 160 Le graphique public void layout LayoutManager layoutMer this layoutMgr if layoutMgr null layoutMgr layoutContainer this delegation Figure 9 9 Instanciation des algorithmes de placement fe derame ESS pi z Pua ES Fo JAN JPanel JPanel s A Layout par nom force Be yout pi JLabel JLabel bel neo L JList d faut vie f Label img IE JLabel Figure 9 10 Instanciation des algorithmes
4. class About implements ActionListener public void actionPerformed ActionEvent e Frame f Frame JComponent e getSource getTopLevelAncestor JOptionPane showMessageDialog f Tortues JAVA MARS 2001 Tortues Java JOptionPane INFORMATION_MESSAGE class Main public static void main String args Mauhly m new Mauhly affreux 15 25 m setArme new Arme 5 m setArmure new Armure 8 m addEquip new Arme 7 m addEquip new Armure 2 Fen tre principale JFrame f new JFrame f getContentPane setBackground Color blue f getContentPane setLayout new FlowLayout JMenuBar jmb new JMenuBar JMenu jmfile new JMenu File JMenultem quit null jmfile add quit new JMenultem Quit quit addActionListener new QuitDialog f JMenu jmhelp new JMenu Help JMenultem about null jmhelp add about new JMenultem About about addActionListener new About jmb add jmfile jmb add jmhelp f setJMenuBar jmb Noeud pour Nom vie force JPanel pl new JPanel pl setBackground Color cyan JTextField jnom pl add jnom new JTextField m getNom jnom addActionListener new ChangeName m pl add new JLabel vie m getVie 177 178 Le graphique pl add new JLabel Force m getForce Panel pour les armes et armure JPanel p2 new JPanel p2 setBackground Color yellow JButton jarme jarmure p2 add jarme new
5. FIG 3 62 relation 1 1 et 0 1 3 11 Exemple recapitulatif Nous allons maintenant utiliser dans un programme tr s simple toutes les notions que nous vues jusqu pr sent Le programme en question va mettre en place une carte 5x5 et cr er 10 montres Les monstres vont alors se d placer et combattre selon une strat gie pr d finie pendant 10 tours cf figure 3 64 La carte est g r e comme d crit dans la figure 3 63 C est donc la carte qui cr e les r gions La logique du jeu lui m me est intimement li au comportement des monstres et se trouve fort logiquement dans la classe Mauhly Nous commentons maintenant le code de cette classe class Mauhly 3 11 Exemple recapitulatif Carte regions f carte Bx int Care nbrow int nbcol int Ey int BgetRegion x int y int Region Region Region carte Carte x int y int MgetCarte Carte geix int BBsetMauhly mauhly Mauhly void igetMauhiy Mauhly region mauhly Mauhly Borce int en Main xp int 10 I NORD int 0 Bain SIRS NE int 1 E SO int 5 Random random OUEST int 6 from util ON int 7 BMauhly nomp String forcep int viep int region Region String nom MBsetRegion region Region void from lang IigetRegion Region Wplay void E bouge direction int v
6. 6 8 Questions remarques 127 aura donc des classes concr tes avec une m thode visiter et d autres donc la visite est prise en compte dans une m thode plus g n rale Ceci peut tre confus pour le pro grammeur De plus comme nous l avons dans le chapitre sur la liaison dynamique ce genre de sucharge param trique peut g n rer des ex cutions peu naturelles sources d erreurs de programmation 2 Le lecteur peut constater que les classes Arme et Sac h ritent deux fois de l inter face JoueurVisitable Ceci est en quelque sorte involontaire c est une simple effet des modifications faites pour la r alisation physique De toute fa on n a aucune influence g nante cf 6 5 4 6 8 Questions remarques Une classe qui d clare implementer une interface mot clef implements mais qui ne d finit pas toutes les m thodes requises par cette derni re doit tre d clar e comme abstraite cf 4 4 les m thodes manquantes pour l implementation compl te de l interface devront tre introduites dans les sous classes Le compilateur v rifie tout cela et g n rent les erreurs associ es Nous avons voqu cet aspect sur la classe Equipement cf 6 7 Classes et interfaces partagent le m me espace de nomage une classe et une interface ne peuvent donc pas avoir le m me nom 128 Les interfaces 7 Les packages 130 Les packages 7 1 Id e de base Jusqu pr sent nous avons nomm nos classes Equipe
7. FIG 3 10 R f rences les r f rences La figure 3 10 montre plusieurs critures quivalentes pour la cr ation d une r f rence et son initialisation momo en plus d tre une r f rence est une variable locale la m thode main En effet elle est d clar e l int rieur du corps de cette derni re Contrairement une variable d instance la port e d un variable locale est limit e au corps de la m thode dans laquelle elle est d finie la variable locale momo est r llement cr e quand la m thode main est appel e et disparait la fin de l ex cution de cette derni re Si la r f rence momo est une variable locale elle ne fait partie de l tat d aucun objet Pourtant cette variable doit forc ment exister quelque part Elle existe en fait dans le contexte d appel de m thode main lui m me faisant partie de la pile d appel du programme Les objet eux sont en fait cr s dans une 42 Classes et objets A M thode setvie d ine amp gt Mauhly setVie 0 10 e Mauhly reposer dans la classe mauhly Fic 3 11 Pile d appel la pile d appel le tas d objets setVie viep Maulhy1 Maulhy nom null Point de Vie 0 Exp rience 0 Force 0 momo F FIG 3 12 la pile d appel espace appel le tas Avec un peu de recul on voit bien qu ex cuter un programme objet c est appeler une m thode qui en s ex cutant va app
8. jf getContentPane add jb jf getContentPane add jtf jf pack jf setVisible true Vous remarquez dans l exemple ci dessus que tous les v nements sont propag s vers une unique instance d eventCatcher Nous pouvons tout fait cr er plusieurs consommateur d v nements Nous pouvons modifier le programme de la mani re suivante import java util import javax swing import java awt import java awt event class EventCatcher implements ActionListener WindowListener KeyListener FocusListener MouseMotionListener private String name EventCatcher String name this name name private void msg AWTEvent e System out printin name Received event e from ActionListener public void actionPerformed ActionEvent e msg e from KeyListener public void keyTyped KeyEvente msg e public void keyPressed KeyEvente msg e public void keyReleased KeyEvente msg e 168 Le graphique from WindowListener public public public public public public public public public public public void windowOpened WindowEvent e msg e void windowClosing WindowEvent e msg e void windowClosed WindowEvent e msg e void windowlconified WindowEvent e msg e void windowDeiconified WindowEvent e msg e void windowActivated WindowEvent e msg e void windowDeactivated WindowEvent e msg e
9. la notion de port e des variables la diff rence entre le paradigme d encapsulation et comment ce prin cipe est r alis dans un langage objet Ici par des controleur d acc s avec une encapsulation bas e sur les classes et non sur les objets la notion de langage typ de coh rence des types de contr le de type 3 3 Instanciation et appel de m thode 39 3 3 Instanciation et appel de m thode Dans les langages de classes comme Java les classes existent avant les avant les objets Comme a priori pour ex cuter un programme il faut des m thodes et ces m thodes ne peuvent tre appel es que sur un objet comment faire pour cr er le premier objet Le probl me a t r solu en introduisant une m thode de classe Cette m thode n a pas besoin qu un objet existe pour pouvoir tre appel e elle s applique direc tement la classe Le mot clef static permet de d clarer une m thode comme m thode de classe et non d instance Dans tout programme java une m thode de classe particuli re appel e main constitue le point d entr e du programme Ce m thode doit avoir imp rativement le profil suivant public static void main String args M a Le param tre formel String args est un tableau de chaine de caract res Nous verrons la manipulation des tableau un peu plus loin Ce tableau permet r cu p rer les param tres de la ligne de commande Par exemple si l utilisateur lance un
10. private int force private int vie private int gt exp 0 _ gt public Mauhly String nomp int forcep int viep nom nomp force forcep M ssi public int getVie return vie private void setVie int viep vie viep public void reposer setVie get Vie 10 FIG 3 20 Contructeur le tas d objets Maulhy1 Maulhy Trono args nom null Point de Vie 0 Exp rience 0 Force 0 FIG 3 21 new Mauhly affreux 100 10 public static void main String args Mauhly momo new Mauhly affreux 100 10 Ms L instanciation d un objet va donc se d composer en 3 tapes 1 la cr ation de l objet dans le tas Nous pouvons voir la l effet du mot clef new l objet est cr l tat des variables d instances qui le compose sont fix es par d faut cf figure 1 2 Les expressions d initialisations sont appliqu es Ici seule la variable d ins tance exp en d finit une ce qui a pour effet de faire passer sa valeur de l tat 0 dans l tat 0 3 4 Instanciation et constructeur 51 la pile d appel le tas d objets Maulhy1 Maulhy nom affreux Point de Vie 100 momo _ Exp rience 0 Force 10 main args FIG 3 22 new Mauhly affreux 100 10 la pile d appel le tas d objets Maulhy1 Maulhy reposer nom affreux momo Point de Vie 100 Exp rience 0
11. Egalit des r f rences la pile d appel m1 Maulhy nom affreux Point de Vie 15 Exp rience 0 Force 25 m2 Maulhy nom pas bo Point de Vie 10 Exp rience 0 Force 30 m2 KY mi r main args le tas d objets FIG 3 45 m1 m2 est faux 65 est faux m me si l tat des objets r f renc est strictement identique comme c est le cas ici la pile d appel m1 Maulhy nom affreux Point de Vie 15 Exp rience 0 Force 25 m2 Maulhy nom pas bo Point de Vie 10 Exp rience 0 Force 30 m2 A ni N le tas d objets FIG 3 46 m1 m2 est vrai 66 Classes et objets Si cette mani re de d terminer si deux r f rences sont gales est compr hensible il est tout aussi utile de d terminer si deux objets sont identiques a b implique a equals b par contre l inverse est faux Dans ce cas nous retombons sur les m mes probl mes que ceux rencontr s pour la copie d objets L galit entre deux objets est d pendante de l application que nous voulons crire Par exemple deux monstres de classe Mauhly peuvent tre identiques si 1ls ont juste le m me nom ou si tous les objets qui composent le sous graphes atteignable depuis ces objets sont identiques Comme la m thode clone pour les copies il existe une m thode equals pour determiner l egalit entre objets Cette relation doit tre reflex
12. f pack f setVisible true La figure 9 4 illustre bien ce probl me nous voyons bien ici que la classe Quit ne sert qu h b rger la m thode action Per formed Elle ne sert qu fournir un receveur factice pour l appel de la m thode actionPerformed La cr ation d un objet Quit ligne 15 n a que peu de sens Les classes internes peuvent fournir une solution plus l gante ce probl me comme nous le montrerons un peu plus tard Pour l instant nous nous int ressons aux classes internes comme nouvelle fonctionnalit du langage 9 4 1 Classes et objets internes Classes et objets externes Il est possible en Java de d finir des classes l int rieur d une classe Nous avons choisit de pr senter cette fonctionnalit du langage maintenant que nous disposons d un probl me pertinent pour utilisation cf Inner class Specification En Java il est possible de d clarer une classe dans une classe d clarer une classe dans une m thode d clarer une classe anonyme dans une m thode Pour fixer le vocabulaire nous prenons la convention suivante si une classe A est d cla r e l int rieur B d une classe B alors A est une classe interne et B est sa classe externe La cons quence pratique de telle d finitions est la suivante Un objet instance d une classe interne ne peut exister sans une instance de sa classe externe Par abus de langage nous parlerons d objets inter
13. DIET method2 Hela Lm K la pile d appel le tas d objets all uneclasse al2 uneclasse e TIC a21 uneclasse er 2 A a31 uneclasse a32 uneclasse FIG 3 52 Etat de la machine virtuelle un instant donn nl args faire apparaitre les probl mes d encapsulation bas e sur les classes en java 3 8 Mort des objets Ramasse miettes ramasse miettes Jolis diagrammes pour illustrer le mark and sweep Objet vivants et morts La figure 3 51 montre un tat possible de la machine virtuelle la figure 3 52 montre un tat ult rieur o les appels de m thodes method2 et method1 sont termin s Supposons que le ramasse miette se d clanche ce mo ment pr cis Le ramasse miette se comporte de la fa on suivante Il parcourt la pile d appel pour trouver les racines du graphe du graphe d objet Ici en l occurence la racine en question est la r f rence m Partant de cette r f rence il parcourt le graphe d objet et marque tous les objets atteignables Les objets non atteignables ne peuvent plus faire l objet d appel de m thodes il 70 Classes et objets la pile d appel le tas d objets all uneclasse a21 uneclasse ref 5 al3 uneclasse a CIE al2 uneclasse Ln args a32 uneclasse oo CIC fa31 uneclasse CIC FIG 3 53 Etat de la machine virtuelle un instant donn
14. FIG 3 59 Vue m moire d un objet tableau deux dimensions la pile d appel le tas d objets tab0 length 3 tab Carte 3 3 args main args ae tab2 length 3 FIG 3 60 Vue m moire d un objet tableau a deux dimensions la cr ation des objets tableaux Nous pouvons clairement nous rendre compte qu un tableau deux dimension est en fait un tableau de tableaux La taille du tableau est disponible sous forme d une variable d instance length 3 de l objet tableau Il est important de noter qu un tableau ne peut contenir que des r f rences ou des types primitifs Le constructeur de l objet carte montre comment nous parcourons la structure de ta bleau et cr ons pour chaque r f rence un objet Region correspondant cf figure 3 61 Il faut remarquer comment nous acc dons aux tailles des objets tableaux regions length et regions i length La m thode d acc s public Region getRegion int x int y utilise une construction que nous n avons pas encore rencontr e les blocs try catch Nous reviendrons en profon deur sur ces constructions dans le chapitre 8 Pour l instant il nous suffit de comprendre que tout acc s dans un tableau peut g n rer une erreur Par exemple il n est pas possible d acc der getRegion 3 6 Si ce cas de figure se produit alors il n est pas possible de conti nuer l ex cution normale du programme L objet tableau r
15. J Sac D Arme C Armure 2 Sac Bi Arme 34 LY Arme s2 Repos EnleverArme Enlever Armure affreux Vie 2 Force 15 La librarie Swing propose le composant graphique javax swing Jtree pour repr senter graphiquement des arbres En fait la classe Jtree est construite comme la vue d un mod le g n rique Ce mod le est d fini par une interface TreeModel Pour pouvoir utiliser un 9 5 Principe du MVC 191 JTree il faut donc au pr alable disposer d une classe mod le i e une classe qui impl mante l interface TreeModel La suite est conforme au MVC on enregistre le JTree aupr s du mod le et tous changement d tat du mod le sera notifi la vue qui se remettre jour automatiquement Ici cette remise jour s appuie sur l interface TreeModel Il y a plusieurs fa on de disposer d un mod le d arbre 1 Impl menter l interface TreeModel directement 2 Utiliser l impl mentation par d faut fournie dans la librairie Swing Nous avons d cid d implanter directement l interface TreeModel parce que cette solu tion ne modifie que tr s peu le mod le La diagramme de classe de la figure 9 33 montre le sch ma g n ral de l application Les classe Arme Armure Sac et Equipement implante un mod le par composition La classe Sac repr sente les noeuds les classes Armes et Armures les feuilles La classe Equipement joue le role de la classe abstraite Figur
16. La figure 4 13 illustre ce cas On y reprend la classe Protection mais l attribut coefProtectionest maintenant d fini comme private afin qu il ne puisse tre modifi qu au travers des m thodes set get associ es La classe Armure est aussi reprise en ajoutant une m thode reparer qui rel ve de deux le coefficient de protection directement et par la r f rence super mais sans passer par les m thodes d acc s La figure 4 8 donne les erreurs obtenues lors de la compilation de la classe Armure La premi re erreur de la figure 4 8 Elle montre bien que la variable coefProtection n existe pas dans la classe dans la classe lorsqu on essaie de l utiliser la ligne 10 de la figure 4 13 La deuxi me erreur correspond l utilisation de la r f rence super faite la ligne 11 de l example java La notation utilis e permet bien de d signer la variable coefProtection de la classe Equipement mais pas d y acc der puisqu elle est d clar e comme private ligne 2 de l exemple java Figure 4 13 private et h ritage public class Protection extends Equipement private int coefProtection int getCoefProtection return coefProtection void setCoefProtection int coef this coefProtection coef public class Armure extends Protection void reparer coefProtection 10 super coefProtection 10 4 6 2 Influence du mot clef protected L id e qu il faut avoir du mot clef protected utilis devant la d
17. l appel Le programme principal suivant permet de visualiser le passage d un objet en param tre d un appel de m thode class Main public static void main String args Mauhly ml new Mauhly affreux 15 25 Mauhly m2 new Mauhly pas bo 10 30 m1 combattre m2 System out println m2 getVie Avant d ex cuter l appel de m thode m1 combattre m2 l tat de la machine virtuelle est celui repr sent dans la figure 3 38 La figure 3 39 illustre l tat de la machine pendant l ex cution de la m thode combattre 3 6 R f rences 61 la pile d appel le tas d objets m1 Maulhy nom affreux Point de Vie 15 Exp rience 0 Force 25 m2 Maulhy nom pas bo Point de Vie 10 Exp rience 0 Force 30 TAA IEN FIG 3 38 Passage de r f rence en param tres la pile d appel le tas d objets m1 Maulhy nom affreux Point de Vie 15 Exp rience 0 Force 25 m2 Maulhy nom pas bo Point de Vie 10 Exp rience 0 Force 30 ICO ICACSR DK mamare main args FIG 3 39 Passage de r f rence en param tres Il faut bien comprendre que tout passage d objets en param tre se fait par r f rence auf lorsqu on utilise les invocations de m thodes distance RMI dans un cas bien particulier Tout changement d tat effectu dans le corps de la m thode sera visible par la m thode appelante Ce qui est tout a fait n
18. package fr loria tortueJava moteur public class DeplacementHorsDuPlateauException extends TortueJavaException public DeplacementHorsDuPlateauException Case c int direction String s super s this _ case c this direction direction public final Case getCase return _case public final int getDirection return direction private Case _case private int direction 146 Exceptions et entr es sorties 8 2 2 Lever d une exception Comme d j dit lorsqu une m thode veut lever une exception elle en cr e une instance puis utilise l instruction throw Consid rons l extrait de code de la figure 8 2 Figure 8 2 Cr ation et lever d une exception private Case calculerCaseSuivante Case depuis int direction throws DeplacementHorsDuPlateauException int xsuivant depuis getX int ysuivant depuis getY switch direction case NordOuest xsuivant ysuivant break case Nord ysuivant break Les autres directions default throw new Error Plateau caseSuivante direction incorrecte N apNlabel ligne exceptions calculerCaseSuivant error a if xsuivant lt O II xsuivant gt cases length II ysuivant lt O II ysuivant gt cases 0 length throw new DeplacementHorsDuPlateauException depuis direction aN label ligne exception calculerCaseSuivante DeplacementHorsDuPlateau a return this case
19. Op rations Structures de donn es priv es Objets Le client n a nul besoin de conna tre la m canique interne de la calculette pour mo difier et consulter les donn es Il lui suffit de presser les touches ad quates Il conna t pr cis ment l ensemble complet des services offerts par l objet au vu du clavier qui est le reflet de l interface sp cifi e par la classe de l objet Celle de la classe POINT est montr e la figure 1 3 Dans le vocabulaire sp cialis une op ration est souvent d sign e par le terme g n rique de m thode Sept m thodes donc sont disponibles Comme nous l avons montr la figure les deux premi res x et y permettent de conna tre les valeurs de l abscisse et de l ordonn e d un point Elles correspondent aux fonctions d acc s de la d finition d un type abstrait cf Fig 1 1 Elles peuvent d ailleurs tre assimil es des fonctions au sens du langage Pascal dans la mesure o elles retournent une valeur ici un nombre r el Les cinq autres m thodes servent d placer le point dans le plan La derni re d placer admet deux param tres r els la valeur du d placement en abscisse et la valeur du d placement en ordonn e respectivement Ces m thodes correspondent aux fonctions de transformation du type abstrait qui retournent une occurrence du type ainsi le r sultat des fonctions empiler et d piler est une nouvelle pile dont le sommet est modifi cf
20. la pile d appel le tas d objets al3 uneclasse Cr ml x args main args a32 uneclasse a31 uneclasse FIG 3 54 Etat de la machine virtuelle un instant donn sont donc ramass s par le ramasse miette Ils sont d truits cf figure 3 53 Avant leur destruction la ramasse miette donne une derni re chance l objet devant tre d truit en appelant la m thode finalize si elle existe 3 9 Constantes variables et m thodes de classes Pour l instant nous avons vu qu une m thode ou une variable taient toujours associ es un objet Nous les avons d ailleurs appel es variables et m thodes d ins tances Il est possible d associer des m thodes et des variables aux classes directe ment Elles se comportent alors presque comme des variables globales et des fonc tions sauf qu elles sont d clar es dans l espace de nommage d une classe Les m canismes d encapsulation jouent tout de m me leur r le Le nom de la classe peut tre utilis comme receveur retour sur main et this les constantes 3 9 Constantes variables et m thodes de classes 71 class Mauhly private String nom private int force private int vie private int exp 10 private Arme arme null private Armure armure null public Mauhly String nomp int forcep int viep nom nomp force forcep vie viep VARES public void finalize System out printin this nom
21. main args Force 10 FIG 3 23 Mauhly momo new Maulhy affreux 100 10 3 Le constructeur est appel l image d une m thode d instance sur l objet nou vellement cr l tat de l objet est chang conform ment au code du contruc teur cf figure 3 4 L objet est d sormais instanci et initialis l affectation de la r f rence momo peut tre r alis e cf figure 3 33 Une erreur classique de compilation consiste crire le programme figure 3 24 En compilant on obtient o javac java Main java 3 cannot resolve symbol symbol constructor Mauhly java lang String int int location class Mauhly Mauhly momo new Mauhly affreux 10 100 A 1 error Attention la pr sence de void dans la d finition de ce pseudo constructeur le transforme en simple m thode d instance et donc ne peut tre appel e en tant que contructeur Si aucun constructeur n est d finit dans une classe le compilateur en fournit un par d faut Le constructeur par d faut pour la classe Mauh1 y est le suivant class Mauhly public MauhlhyO 52 Classes et objets public static void main String args Mauhly momo new Mauhly affreux 100 10 Meia class Mauhly private String nom private int force private int vie private int exp 0 public mylabelrvoidvoid Mauhly String nomp int forcep int viep nom nomp force forcep setVie viep Mens FIG 3 24
22. tat qu en utilisant l une d entre elles Si l on applique le principe d encapsulation seules les op rations d finies dans le comportement d un objet peuvent acc der l tat de celui ci Pour l instant la seule chose que je peux demander mon objet h ros c est de se reposer La notion d objet n est li e aucun langage objet en particulier c est une fa on de mod liser un univers Nous avons abord les notions fondamen tales d identit d tat et de comportement d un objet ainsi que le principe d encapulation Etes vous capables d expliquer chacune de ces notions Le h ros peut boire une potion contenue dans son sac m thode boire potion 32 Classes et objets a D finition d un com mentaire Tout texte apparais definition de la classe Maulhy sant derri re est un commentaire private String nom d finition de la classe a private int force Mauhly private int vie D Cette section d finit la struc private int exp ture de l tat des objets cr s Les variables ainsi d finies sont public int getForce appel es variables d instances return Force Chaque instance de Mauhly i e e chaque objet cr en utilisant public int getExp cette classe comme mod le aura return exp donc son tat structur selon cette d finition Le D Cette section d finit le com portement des objets
23. une s quence On va s orienter soit sur des tableaux des vecteurs des tables de hashage Toutes ces structures permettant de repr senter des relations 0 n sont g n rale ment regroup es dans un ensemble de classes appel es collections car elles per mettent de cr er des collections d objets 3 10 Relations O n 73 6 D claration d un r f rence sur un objet tableau a deux di class Carte mensions private gt Region regions D Instanciation d un object ta bleau contenant des r f rencese non initialis es sss Fae nm 1 6 Acc s la dimension du pre for int j 0 j lt regions iJ length j mier tableau En fait acc s une regionsli j new Region this i j variable d instance de l objet ta Pa a bleau i F Acc s la deuxi me dimen public Region getRegion int x int y sion On voit d j ici qu un ta 0 t e lt try bleau a deux dimensions est un z return regions x y tableau de tableaux catch ArrayIndexOutOfBoundsException e return null Affection des r f rences contenus dans les objets tableauxe sur des objets regions 6 Acces un l ment du ta bleau le bloc try catch est ici pour intercepter une eventuelle exception Celle ci peut se pro duire si on tente d acc der une cellule du tableau qui n existe pas FIG 3 58 D claration initialisation et
24. void focusGained FocusEvent e msg e void focusLost FocusEvent e msg e void mouseDragged MouseEvent e msg e void mouseMoved MouseEvent e msg e class Main public static void main String args JFrame jf new JFrame jf getContentPane setLayout new FlowLayout EventCatcher ev1 new EventCatcher ev 1 EventCatcher ev2 new EventCatcher ev2 jf jf jf add WindowListener ev 1 addKeyListener ev 1 addMouseMotionListener ev 1 JButton jb new JButton Bouton jb jb addActionListener ev2 addFocusListener ev2 JTextField jtf new JTextField Texte jtf addActionListener ev2 jf jf jf jf getContentPane add jb getContentPane add jtf pack setVisible true evl Received event java awt event WindowEvent WINDOW_ACTIVATED on frame0 ev2 Received event java awt event FocusEvent FOCUS_GAINED permanent on javax swing JButton evl Received event java awt event WindowEventt WINDOW_OPENED on frame0 evl Received event java awt event MouseEvent MOUSE_MOVED 28 30 mods 0 clickCou nt 0 on frame0 evl Received event java awt event WindowEvent WINDOW_DEACTIVATED on frame0 ev2 Received event java awt event FocusEvent FOCUS_LOST temporary on javax swin 9 3 G rer les v nements le mod le par d l gation 169 9 3 1 Un exemple simple Nous appliquons le mod le par d l gation sur notre exempl
25. 3 ou lorsque l on essaie de la d river en une classe B lignes lignes 5 7 On peut se poser la question de l utilit d une telle chose Certaines classes sont parfois form es uniquement de variables et m thodes statiques typiquement des fonctions s ap pliquant sur des types primitifs un ensemble de fonctions math matique sur des r els par exemple Dans ce cas cr er une instance cr er une instance de la classe ne rime rien et il vaut mieux emp cher ceci par tous les moyens Figure 4 12 Une classe totalement non instanciable abstract class A private AQ System out println A static public A factory return new AQ class B extends A BO System out printin B class TestNonInstanciable public static void main String args A a A factory 4 5 Classes m thodes et attributs finaux 4 5 1 Classes finales La d claration d une classe java peut tre pr c d e du mot clef final ceci a pour effet de rendre impossible toute d finition de nouvelles sous classes partir de cette classe 98 L h ritage TestNonInstanciable java 6 class A is an abstract class It can t be instantiated Hoe return new Al N CRTC TENTE ON TENTE NUE TENUE ENT TestNonInstanciable java 10 No constructor matching A found in class A A r 2 Errors FIG 4 7 Erreurs de compilation lors de l usage d une classe non instanc
26. 81 82 83 84 84 87 90 90 93 93 93 96 97 97 98 98 98 98 99 100 102 102 103 104 104 105 106 106 107 110 112 113 114 114 114 115 117 117 117 118 118 118 120 126 Table des mati res 6 8 Questions remarques 7 Les packages 7 1 Id e de base 7 2 Cr ation utilisation noms 7 2 1 Package par d faut 7 2 2 Quelques subtilit s dans l utilisation des clauses import 7 3 Retour sur les contr les d acc s public d faut 7 3 1 Acc s une classe ou un interface 7 3 2 Acc s aux l ments d une classe 7 4 Exemples 7 4 1 Une classe utilitaire 7 4 2 Groupements de classes et factory 7 5 Stockage des package CLASSPATH et autres d tails 7 5 1 Application l exemple cf 7 4 1 8 Exceptions et entr es sorties 8 1 Id e de base 8 2 Anatomie et cycle de vie 8 2 1 Des objets et des classes 8 2 2 Lever d une exception 8 2 3 Propagation 8 2 4 Capture 8 3 Exception et h ritage 9 Le graphique 9 1 Applications graphiques 9 2 Construire un cran graphique le mod le composite 9 2 1 Construction de l arbre 9 2 2 Gestion du placement 9 3 G rer les v nements le mod le par d l gation 9 3 1 Un exemple simple 9 3 2 Gestion des menus 9 3 3 Gestion des dialogues 9 4 Applications graphiques et classes internes 9 4 1 Classes et objets internes Classes et objets externes 9 5 Principe du MVC 9 5 1 Minitortues le MVC en action 9 5 2 Le MVC dans Swing 9 6 Graphisme 2D les bases
27. Cette classe Potion implemente donc pour de bon les m thodes relatives la masse et la valeur d une potion selon qu elle ai t bue ou non Dans Pot ion toutes les m thodes abstraites h rit es de Equipement ont t impl ment es donc cette classe n a plus besoin d tre elle m me d clar e comme abstract Figure 4 10 Impl mentation des m thodes abstraites de la figure 4 9 public class Potion extends Equipement private final static int MASSE FIOLE 30 grammes private final static int MASSE LIQUIDE 5 grammes int valeur valeur si non bue boolean bue false int getMasse return MASSE_FIOLE bue 0 MASSE_LIQUIDE void setMasse int masse int getValeur return bue 0 valeur void setValeur int valeur this valeur valeur public String toString return Potion bue bue L L super toString Une classe abstraite peut tr s bien tre utilis e pour effectuer des op rations tout fait 4 4 Classes et m thodes abstraites 95 Equipement oetMasse setasse uetValeur set aleur toString _ contient contenu Protection Potion amp MASSE FIOLE int 30 amp MASSE LIQUIDE int 5 Pvaleur int hue boolean false getM asse HsetMasse ae tM asse getV aleur set aleur StoStringl FIG 4 6 Diagramme de classe d un exemple de pattern composite Participant du pattern classe java de
28. Dans le MVC les r les la base sont bien d finis La vue est un objet graphique ou une composition d objets graphique Sa caract ris tique principale et de pouvoir recevoir des notifications du mod le que celui ci change d tat Pour que le mod le puissent envoyer des messages une vue celle ci doit se conformer une interface Dans la librairie Java cette interface est java util Observer Dans la figure 9 28 les vues sont les classes impl mant I interface java util Observer Elles doivent donc impl menter la m thode update Pour remettre les composants graphiques jour les vues doivent pouvoir acc der au mod le et relire l tat du mod le Pour cela elles doivent avoir une r f rence sur le mo d le Cette r f rence peut tre obtenue en utilisant le premier param tre de la m thode update qui r f rence l objet observable qui a mis la notification Cette r f rence peut g r e au moment de la construction que on construit une vue on donne en para m tre du construction quel est le mod le observ Ici nous avons choisit de d clarer les vues comme classes internes du mod le Cela a plusieurs cons quences 1 La vue ne peut exister sans le mod le En effet une instance d une classe interne ne peut exister sans une instance dans sa classe externe 2 La vue a un acc s privil gi l tat du mod le En effet un objet interne voit directement l tat de son
29. KeyListener FocusListener MouseMotionListener private void msg AWTEvent e System out printin Received event e from ActionListener public void actionPerformed ActionEvent e msg e from KeyListener public void keyTyped KeyEvente msg e public void keyPressed KeyEvente msg e public void keyReleased KeyEvente msg e from WindowListener public void windowOpened WindowEvent e msg e public void windowClosing WindowEvent e msg e public void windowClosed WindowEvent e msg e public void windowlIconified WindowEvent e msg e public void windowDeiconified WindowEvent e msg e public void windowActivated WindowEvent e msg e public void windowDeactivated WindowEvent e msg e public void focusGained FocusEvent e msg e public void focusLost FocusEvent e msg e public void mouseDragged MouseEvent e msg e public void mouseMoved MouseEvent e msg e 9 3 G rer les v nements le mod le par d l gation 167 class Main public static void main String args JFrame jf new JFrame jf getContentPane setLayout new FlowLayout EventCatcher ev new EventCatcher jf addWindowListener ev jf addKeyListener ev jf addMouseMotionListener ev JButton jb new JButton appuie _ici jb addActionListener ev jb addFocusListener ev JTextField jtf new JTextField crit ici jtf addActionListener ev
30. Les situ s dans le package par d faut masquent aussi celles import es par la clause de la deuxi me forme Des masquages intempestifs peuvent se produire car le package java lang est im port par d faut par une clause import java lang dans toute unit de compila tion Il suffit de d finir une classe de m me nom simple qu une classe pr d finie de java Integer par exemple pour que cette derni re soit masqu e dans le code 7 3 Retour sur les contr les d acc s public d faut Maintenant que nous avons introduit plus pr cisemment la notion de package nous pou vons revenir sur les contr les d acc s disponibles en java cf 4 6 car la notion d apparte nance d une classe un package est importante dans la d finition de ceux ci De plus quand rien est pr cis en java l acc s est restreint aux classes d un m me package 7 3 1 Acc s une classe ou un interface Si la d claration d une classe ou interface est pr c d e du nom clef public elle peut tre utilis e dans n importe qu elle unit de compilation condition que cette derni re poss de une clause import appropri e sauf si l unit de compilation et la classe vis e appartiennent au m me package il n y a rien pr ciser dans ce cas Par utilisation il faut comprendre typage de variables param tres et r sultat de fonctions utilisation comme super classe ou comme interface implementer cr ation d object l aide
31. Nous aurions aussi pu lever une exception java lang 1lllegalArgumentExcept ion sous classe de java lang RuntimeException Pourquoi avoir adopt une exception v rifi e dans un cas et une non v rifi e dans un 8 2 Anatomie et cycle de vie 147 autre Pour le premier cas d placement impossible cela refl te une fonction d sir de la m thode elle d termine la case suivante ou indique par une exception que le d placement est impossible les deux possibilit s correspondent 4 un fonctionnement normal du code Par contre l autre cas l erreur refl te une utilisation incorrecte de la m thode de la part du programmeur il doit utiliser une des constantes pr d finie Si une telle erreur est lev e le programmeur doit corriger son code pour qu elle n appara sse plus 8 2 3 Propagation Lorsqu une exception v rifi e peut tre lev e dans le code d une m thode elle doit tre trait e voir paragraphe suivant ou progag e vers le contexte pile l ex cution du code qui a appel cette m thode Pour qu elle soit propag e il n y a en fait rien faire durant l ex cution il suffit que l exeption lev e reste dans le contexte d ex cution Il suffit donc juste que le compilateur accepte le fait que l exeption n est pas imm diatement prise en compte il faut pr ciser que la m thode peut lever cette exception ou une de ses super classes comme nous le verrons dans la suite La figure do
32. c est en se reposant et ou enlevant armes et armures que le mod le change C est donc les boutons repos enlever arme et enlever armure qui vont provoquer les changements dans le mod le Pour tre plus pr cis ce sont les classes qui coutent les v nements en provenance de ces boutons qui vont r ellement op rer le changement d tat du mod le Dans notre exemple le contr leur est repr sent par la classe Controller Cette classe est elle m me une vue Ceci n est pas obligatoire mais arrive tr s fr quemment En ef fet l tat des boutons peut changer suivant l tat du mod le Par exemple une fois qu on a enlev l armure le bouton permettant d enlever l armure se grise automati quement Cela est du au fait que le changement d tat corresposant la remise dans l armure dans le sac va tre notifi au contr leur qui va grise le bouton correspondant Le contr leur doit avoir une r f rence sur le mod le pour pouvoir appeller les m thodes de changement d tat Dans notre exemple nous avons d clar le contr leur comme classe interne du mod le Ceci ne fait pas partie du MVC originel mais quelques petits avantages 1 par construction le contr leur ne peut pas exister sans le mod le 2 le contr leur peut observer plus facilement l tat du mod le 3 le code du cont leur se trouve physiquement dans le m me fichier que le code du mod le mais en restant bien con
33. clar e comme finale peut parfaitement tre masqu e dans une sous classe 4 6 De l influence de protected public et autres controle d acc s 4 6 1 Influence du mot clef private L utilisation du mot clef private cf 3 devant une d claration de m thode ou attribut de classe ou d instance rend inaccessible cet l ment a tout code except celui de sa classe 4 6 De l influence de protected public et autres contr le d acc s 99 Du point de vue de l h ritage cela veut dire que les attributs et m thodes d clar s comme private ne sont pas h rit s par les sous classes Il n y a pas de liaison dynamique dans ce cas Le mot clef private peut aussi tre appliqu a la d finition d un constructeur Dans ce cas son influence est r duite a l acc s puisque les constructeurs ne s h ritent pas cf 4 3 4 L utilisation de private dans ce cas emp che l appel de new pour le constructeur concern partir de code ext rieur sa classe Elle emp che aussi l utilisation de la notation super associ e ce constructeur dans les constructeurs des classes imm diatement d riv es La g n ration d appel par d faut super cf 4 3 4 peut interf rer avec cette derni re restriction d acc s et g n rer de subtiles erreurs la compilation Par contre l utilisation de new resp super reste parfaitement utilisable dans le code de la classe resp dans les constructeurs de la classe
34. claration d une m thode d instance constructeur compris ou de classe ou celle d une variable d instance ou de classe est que l l ment ainsi d clar ne peut tre acc d que par la classe elle m me ou une de ses sous classe La d finition exacte donn e dans 6 6 2 est compliqu e Il vaut mieux 100 L h ritage Armure java 3 Undefined variable coefProtection coefProtection 10 A Armure java 4 Variable coefProtection in class Protection not accessible from class Armure super coefProtection 10 A 2 errors FIG 4 8 Erreurs de compilation de la classe Armure de la figure 4 13 garder en t te l id e pr sent e ici qui est une l g re restriction de la d finition on vite ainsi certaines erreurs subtiles En fait protected est une protection selon une encapsulation de classe le code d une instance d une classe peut tr s bien acc der des m thodes ou variables d instances d une autre instance de la m me classe ou d une sous classe la notation super permet d appeler un constructeur prot g par contreUtilisa tion de new sur un constructeur protected n est pas autoris Nous verrons au chapitre 7 que lorsque rien n est pr cis lors de la d claration d un attribut ou d une m thode l acc s par d faut est package Celui ci prime sur protected 4 7 La classe Object Comme d j voqu plusieurs fois il existe une classe tout
35. e dans page 331 Elle permet qu un m thode nouvellement surcharg e soit bien prise en compte sans recompilation des classes clients Il suffit de modifier aussi la m thode existante afin de 110 La liaison dynamique rediriger les invocations concernant la nouvelle Pour la classe Visiteur cette modification est indiqu e sur la figure 5 4 Dans la m thode initiale qui continue d tre appel e il suffit de tester le type dynamique du param tre ligne 2 et d appeler la nouvelle m thode surcharg e ligne 4 Il faut noter l utilisation du transtypage explicite vers Arme de fa on que le type statique du param tre de cette deuxi me invocation soit bien Arme afin que la nouvelle m thode soit bien applicable Arme tant une sous classe de Equipement elle sera donc aussi la plus sp cifique Cette modification a donc bien l effet escompt si la m thode initiale sur les Equipement est appel e avec un param tre donc le type dynamique est Arme l appel sera propag la nouvelle m thode d di es la visite des Arme Figure 5 4 Redirection d invocation d une m thode class Visiteur public void visiter Equipement e if e instanceof Arme visiter Arme e else System out printin visiter Equipement public void visiter Arme a System out println visiter Arme 5 3 Liaison dynamique et constructeurs Si la liaison dynamique n a pas de sens sur les constructeu
36. initialisation de la ligne 10 n a pas encore t valu e puisque la construction de la partie de l objet li e la sous classe se fera apr s celle li e B Donc la valeur de la variable d instance b d finie dans B est acc d e par get Val avant d tre initialis e la m thode acc de donc la valeur par d faut fix e par le langage 0 dans la cas d un nombre Par contre le constructeur de A af 5 3 Liaison dynamique et constructeurs 111 getVal 0 a 10 getVal 5 b 5 FIG 5 4 Ex cution l exemple 5 5 fiche bien la valeur initialis e de la variable d instance a puisque les expressions d valution d une classe sont valu es avant le constructeur La deuxi me ligne de la trace d ex cution conrespondant l ex cution du constructeur de B Cette fois l appel get Val de la ligne 12 bien qu il acc de toujours la m me m thode retourne 5 car l expression d initialisation de la ligne 10 a t valu e avant l appel du constructeur de B Ce ne n est absolument pas le cas en C Si l appel de m thode est pourtant bien d cla r e comme virtual dans un constructeur on appelle la m thode de la classe du constructeur pas celle du type dynamique De plus si l on veut forcer les choses l aide d une m thode virtuelle pure 0 on obtient une erreur la compilation cons c In method A A cons c 8 abstract virtual int A getVal called f
37. loria tortueJava config import fr loria tortueJava moteur Monstre class Mauhly extends Monstre Mauhly0 super 15 public void combattre Monstre ennemi if ennemi instanceof Mhaziny ennemi setVie 0 else this setVie 0 package fr loria tortueJava config import fr loria tortueJava moteur Monstre class Handrey extends Monstre Handrey super 20 public void combattre Monstre ennemi this set Vie 0 package fr loria tortueJava config import java util Random import fr loria tortueJava moteur Monstre import fr loria tortueJava moteur FabriqueDeMonstres public class LeLoria implements FabriqueDeMonstres public Monstre fabriquerUnMonstre switch rand nextInt 6 case 0 return new Mhaziny race l paca 9 raturn naw Manhly 137 138 Les packages Il nous reste esquisser l utilisation de notre fabrique par un code client La solution la plus simple est donn e sur la figure 7 4 Dans cet exemple plac dans le package sans nom nous cr ons ligne 6 une instance de LeLoria publique avec un contructeur pu blique manipul e par fab une r f rence d interface FabriqueDeMonst res interface publique Puis grace a cette instance nous cr ons des monstres par la m thode publique fabriquerUnMonstre manipul s via une r f rence un Monst re Les diff rentes clauses import simplifient l criture Nous pouvons
38. objet L criture d un programme commence bien par la d finition des classes mo d lisant l univers de l application trait e Les objets n cessaires sont ensuite cr s par instanciation des classes et les actions effectuer sont accomplies en envoyant les messages ad quats aux objets 1 3 Ex cuter un programme Pour tre op rationnel plus rapidement et passer imm diatement du concret pla ons nous d embl e en situation de travaux pratiques comme si nous tions devant la machine L objectif est d expliquer comment fonctionnent la compilation et l ex cution d un programme Java tr s rudimentaire de mani re ce que le lecteur puisse essayer une partie des exemples au fur et mesure de son avancement 1 3 1 La machine virtuelle Java Le composant central de l environnement Java est sa machine virtuelle Pour bien comprendre en quoi elle consiste revenons des machines qui sont s rement plus attractives vu leur succ s actuel les consoles de jeu dont les Gameboy et autres PlayStation sont des exemples bien connus Des jeux pr vus pour une console peuvent quelquefois se pratiquer sur un ordina teur personnel gr ce un programme appel mulateur qui simule le fonctionnement de la console et permet donc d utiliser n importe quel programme de jeu s ex cutant sur la dite console Tout se passe comme si l on disposait physiquement de la console bien que celle ci n existe en fait q
39. ordre jusqu trouver un fichier conte 16 La conception de logiciel nant le code compil de la classe qui lui est donn e en param tre dans notre cas donc un fichier appel Hello class Si la variable CLASSPATH n est pas positionn e la machine Java cherche simplement dans le r pertoire courant toujours dans le cas d une station de travail Sun 6 L ex cution d marre alors la premi re instruction de la m thode main Pour ce premier exemple le r sultat serait le suivant java Hello hello world CA NE VA PAS CA NE CORRESPOND PAS A CE QUI EST DIT La figure 1 1 Figure 1 1 Sch ma de compilation et ex cution d un programme Java TC class Mot class Phrase OS NATIF class HelloWorld public static main 10 GUI helloWofldAppli java javac helloWorldAppli java java HelloWorld RES eg errr a i 1 L f ae i 0000000 0000000 0000000 ACC S contr l par i CLASSPATH 0000000 0000000 0000000 i oprintoo oprintoo omainoo Ce 0000000 0000000 0000000 v i Mot class Phrase class HelloWorld class i Eo z A 0000000 0000000 oprintoo oprintoo 0000000 0000000 0000000 0000000 i l Hello class World class j r sume graphiquement le processus de compilation et d ex cution du programme Java 1 3 3 La biblioth que Java Il est certain que cett
40. programme Java en tapant cette commande cd Tortues java Copy Maulhy java Masini java Alors a l ex cution le param tre formel args aura pour valeur un tableau de cha nes de caract res contenant Maulhy java et Masini java Nous allons maintenant cr er v ritablement des objets de classe Maulhy Pour cela il me faut un point d entr e soit j ajoute une m thode main la classe Maulhy soit je cr e une nouvelle classe juste pour h berger le point d entr e J opte pour la seconde solution juste par convention de programmation Je cr e donc une nouvelle classe que j appelle arbitrairement Main pour h berger le point d entr e Le programme de la figure 3 8 instancie un objet de classe Mauh1y et effectue plusieurs appel de m thodes Le r sultat de l ex cution de ce programme apparait dans la figure 3 3 Intuitivement ce r sultat semble correct En effet la m thode main commence par cr er un objet de classe Mauh1y imprime le nombre de point de vie de cet objet demande au monstre de se reposer puis affiche le nombre de points de vie nouveau L ex cution de la m thode de classe main de la classe Main cf 3 8 commence par cr er un objet de classe Mauhl1y et garde une r f rence sur cet objet nomm e momo Il nous faut donc d finir maintenant ce qu est une r f rence dans un langage de classe et apr s nous regarderons de plus pr s les subtilit s li es la cr ation de notre premie
41. ritable machine la Java Station sans r el succ s commercial ou encore en implantant la machine virtuelle sur un processeur sp cialis avec PicoJava ou JSCP pour des syst mes embarqu s Plus concr tement une fois le code source d une application crit en langage Java Un compilateur traduit les instructions Java dans le langage plus primitif de la machine virtuelle qui est ind pendant de toute architecture mat rielle La machine virtuelle Java de la machine cible charge le programme sous sa forme compil e et l ex cute Le m me code compil donc la m me application peut ensuite tre ex cut tel quel sans aucune modification sur toute autre architecture implantant la machine virtuelle Avec des langages comme C ou C il faudrait proc der une nouvelle compilation voire des modifications du code source pour l adapter aux caract ris tiques de la nouvelle architecture Cet avantage est des plus appr ciables et constitue sans doute le principal int r t de Java quand on sait que les portages sont le plus souvent d un co t tr s lev en rai son des probl mes tr s techniques qu ils soul vent Imaginez le travail que repr sente l criture d un navigateur qui doit fonctionner sur MacOS les diff rentes versions de Windows et les multiples versions d UNIX pour ne parler que des syst mes les plus r pandus 1 3 2 Compilation et ex cution d un programme Passons imm diatemen
42. vie m getVie pl add new Label Force m getForce Panel pour les armes et armure Panel p2 new Panel p2 setBackground Color yellow p2 add new Label Arme m getArme p2 add new Label Armure m getArmure panel pour visualiser le contenu du sac Panel p3 new Panel p3 setBackground Color green java awt List 1 new java awt List p3 add 1 for Enumeration e m getEquip e hasMoreElements add _ e nextElement aggr gation des diff rents panel f add p1 f add p2 f add p3 Arbre pr t Affichage f pack f setVisible true Pour construire cet cran nous avons utilis la librairie AWT Nous pouvons construire la m me interface en suivant le m me principe de composition mais avec une autre librairie la librairie swing Le programme est quasiment identique import java util import javax swing on utilise swing import java awt class Main public static void main String args Mauhly m new Mauhly affreux 15 25 9 2 Construire un cran graphique le mod le composite 157 m setArme new Arme 5 m setArmure new Armure 8 m addEquip new Arme 7 m addEquip new Armure 2 JFrame f new JFrame attention ici c est un JFrame f getContentPane setBackground Color blue ae JPanel pl new JPanel JPanel pl setBackground Color cyan pl add new JLabel Nom m getNom
43. 2 Cahier des charges Tortues Java 22 Cahier des charges Tortues Java 2 1 Les tortues java Le jeu se d roule sur un ensemble de cartes pr d finies en forme de grilles rec tangulaires peupl es de monstres hostiles et belliqueux Le h ros doit amasser un maximum de richesses et accessoirement d couvrir Amulette de Java dissimul e dans la derni re carte avant de quitter le jeu 2 1 1 Les l ments du jeu Les cartes Il existe un nombre nbCartes invariable de cartes rectangulaires de dimensions identiques d coup es en long xlarg cases Une case contient un l ment de paysage herbe arbre ou eau ces deux derniers constituant des obstacles infranchissables par les acteurs du jeu Une case franchissable contenant de l herbe peut dissimuler une porte permet tant au h ros et uniquement au h ros de passer la carte suivante Une porte n est visible qu au joueur se trouvant sur la case qui la contient Elle est sens unique elle ne permet pas de retourner la carte pr c dente Une case franchissable peut galement contenir un ou plusieurs objets armes potions magiques or sac Un et un seul acteur peut occuper une case un instant donn Les acteurs Le h ros est quip d une armure d un bouclier d une arme de poing et porte un sac de capacit illimit Il est caract ris par un coefficient de force force des points d exp rience exp qui croissent au fur et mesure du
44. 30 Mauhly m3 m2 ml m FIG 3 34 Affectation de r f rences la pile d appel m1 Maulhy nom affreux Point de Vie 15 Exp rience 0 Force 25 m2 Maulhy nom pas bo Point de Vie 10 Exp rience 0 Force 30 m3 eK m2 X mi YN args le tas d objets FIG 3 35 Affectation de r f rences la pile d appel m1 Maulhy nom affreux Point de Vie 15 Exp rience 0 Force 25 m2 Maulhy nom pas bo Point de Vie 10 Exp rience 0 Force 30 main args le tas d objets FIG 3 36 Affectation de r f rences 59 60 Classes et objets class Mauhly private String nom private int force private int vie private int exp 10 public Mauhly String nomp int forcep int viep nom nomp force forcep vie viep public void combattre Mauhly ennemi ennemi set Vie ennemi get Vie this force public int getVie return vie private void setVie int viep vie viep public void reposer setVie getVie 10 FIG 3 37 Passage de r f rence en param tres une r f rence sur un objet de classe Mauhly en param tre Lorsque cette m thode est appel e le passage de param tre s effectue par r f rence i e l objet pass en param tre n est pas copi ennemi n est rien de plus qu un r f rence suppl mentaire sur l objet d sign
45. 58 FIG 3 9 r sultat du programme de la figure 3 8 de cet objet n est reserv qu l usage exclusif de la machine virtuelle java Donc le seul moyen pour le d signer et de lui attribuer une r f rence d s sa naissance si cette pr caution n est pas prise ce n est pas tr s grave juste inutile car l objet nouvellement cr est alors d finitivement perdu car non atteignable Une r f rence est un lien typ sur un objet typ Les types doivent tre compa ble Bien sur deux types identiques sont compatibles Pour toute r f rence il y a donc deux types le type de la r f rence appel type statique et le type de l objet r f renc appel type dynamique La compr hension de la notion de type statique type dynamique est fondamentale pour la suite une r f rence n a que deux tats possibles soit elle d signe un objet dont le type est compatible avec le type de la r f rence soit elle d signe rien et dans ce cas sa valeur est gale null nul1 est un mot clef du langage java il permet d initialiser 3 3 Instanciation et appel de m thode 41 class Main public static void main String args alonglabel momol Mauhly momo new Mauhly class Main public static void main String args alonglabel momo2 Mauhly momo null momo new Maulhy class Main public static void main String args alonglabel momo3 Mauhly momo momo new Maulhy
46. ActionEvent e System exit 0 class ChangeName implements ActionListener private Mauhly m ChangeName Mauhly m this m m public void actionPerformed ActionEvent e System out printin e paramString System out println e getActionCommand m setNom e paramString class Main public static void main String args Mauhly m new Mauhly affreux 15 25 m setArme new Arme 5 m setArmure new Armure 8 m addEquip new Arme 7 m addEquip new Armure 2 Fen tre principale JFrame f new JFrame f getContentPane setBackground Color blue f getContentPane setLayout new FlowLayout Noeud pour Nom vie force JPanel pl new JPanel pl setBackground Color cyan JTextField jnom pl add jnom new JTextField m getNom jnom addActionListener new ChangeName m pl add new JLabel vie m getVie pl add new JLabel Force m getForce Panel pour les armes et armure JPanel p2 new JPanel p2 setBackground Color yellow JButton jarme jarmure p2 add jarme new JButton Arme m getArme p2 add jarmure new JButton Armure m getArmure panel pour visualiser le contenu du sac JPanel p3 new JPanel p3 setBackground Color green java awt List l new java awt List 9 3 G rer les v nements le mod le par d l gation 173 for Enumeration e m getEquip e hasMoreElements l add e nextElem
47. Annexe Lexique Java Annexe B lements de syntaxe Java Annexe C UML 127 129 130 130 131 131 132 132 132 133 133 134 139 140 143 144 145 145 146 147 148 149 151 152 152 153 158 163 169 173 175 178 179 181 187 190 193 197 199 201 Table des mati res 1 La conception de logiciel 4 La conception de logiciel La baisse des co ts du mat riel parall lement a l augmentation des performances a fait exploser le d veloppement des applications et augmenter la demande en logi ciel tel point que le syst me conomique mondial est devenue irr m diablement d pendant de la bonne marche de syst mes informatiques L utilisation de l informa tique se g n ralise tous les domaines transport a rien banques h pitaux cin ma jeux etc Augmenter en proportion le nombre d informaticiens pour r pondre cette demande ne sert rien Il est n cessaire d appliquer une technologie en mati re de conception et d veloppement de grands syst mes logiciel autrement dit en mati re de g nie logiciel Le g nie logiciel n est pas plus de la programmation que de l informatique Construire un syst me logiciel ne n cessite pas la seule utilisation d un voire de plusieurs langages de programmation Les tapes pr alables la programmation pro prement dite requi rent la mise en uvre de m thodes de sp cification et de concep tion applications de t
48. Bie int Main exp int 10 Es NORD int 0 NE int 1 rain Ws EST int 2 SO int 5 Random random E ON int 7 from util BMauhly nomp String forcep int viep int region Region BsetRegion region Region void String nom getRegion Region from tang Bplay void E bouge direction int void Ecombattre ennemi Mauhly void BXgetVie int EisetVie viep int void reposer void FIG 3 57 Diagramme de classe pour la gestion de la carte sch mas UML correspondants repr sentation des truc statiques 3 10 Relations 0 n Jusqu a pr sent nous avons cr s des graphes d objets ou il n existe que des re lations 1 1 entre deux objets Un monstre a une arme une arme appartient ou n ap partient pas une monstre Comment repr senter des relations 0 n Par exemple si je veux repr senter la carte des tortues Java Il va forc ment exister un objet carte Une carte est elle m me compos e de cases plus pr cisement d une matrice de cases Les cases vont tre elles aussi des objets et l objet carte va contenir 0 n cases La figure 3 57 montre le diagramme de classe que nous voulons r aliser pour les tortues Java Il existe dans les langages objets plusieurs mani re de repr senter ces relations Suivant le type de la relation que l on a repr senter par exemple est ce un ensemble
49. Erreur classique sur les constructeurs Par contre si un constructeur par d faut est d finit alors il doit tre utilis Par exemple si j essaye de compiler le programme suivant class Main public static void main String args Mauhly momo new Mauhly System out printin momo getVie momo reposer System out printin momo getVie J obtiens l erreur suivante javac Main2 java Main2 java 3 cannot resolve symbol symbol constructor Mauhly location class Mauhly Mauhly momo new Mauhly A 1 error En effet le constructeur par d faut n existe pas puisque j en ai d finit un avec 3 param tres Il est possible de d finir plusieurs constructeurs pour une m me classe en utilisant la surcharge param trique ou overloading en anglais Il est possible en Java de d finir deux m thodes de m me nom mais avec une liste de param tres diff rentes Le nombre de param tres peut tre diff rent et ou le type des param tres peut tre diff rents 3 4 Instanciation et constructeur 53 class Mauhly private String nom private int force private int vie private int exp 0 Attention Cette m thode est bien un constructeur public Mauhly String nomp int forcep int viep nom nomp force forcep setVie viep Attention Cette m thode n est pas constructeur C est juste une m thode d instance normale Le constructeur et cette m thode peuvent cohabiter
50. Fig 1 1 Toutefois le type abstrait est un formalisme math matique conc u pour d crire rigoureusement les op rations et leurs propri t s au travers d une sp cification fonctionnelle Son principe ne peut tre totalement res pect lors de la phase d implantation qui permet de passer du type abstrait la classe Cela impliquerait entre autres que chaque m thode de transformation retourne une copie modifi e de l objet sur lequel elle op re entra nant un g chis de ressources inconcevable en pratique Du point de vue math matique le probl me ne se pose pas puisque la notion d espace m moire n existe pas Du point de vue pratique il est r gl par l utilisation d effets de bord Les cinq m thodes sont assimil es des proc dures qui modifient les valeurs de l abscisse et de l ordonn e du point en intervenant 1 2 Analyse et conception 11 Classe POINT Variables d instance abscisse REEL ordonn e R EL M thodes fonction x R EL retourner abscisse fin fonction fonction y REEL retourner ordonn e fin fonction proc dure en_haut ordonn e ordonn e fin proc dure proc dure _ droite abscisse abscisse fin proc dure proc dure en_bas ordonn e ordonn e fin proc dure proc dure _gauche abscisse abscisse fin proc dure proc dure d placer dx R abscisse abscisse ordo
51. Les variables d instance introduites par la classe A1 sont initialis es l aide des affec tations indiqu es dans leur d claration ici a 10 ligne 2 puis le reste du construc teur de la classe A1 continue ligne 4 et retourne 92 L h ritage Object CODE 1 int a 10 Al f appel implicite super Appel de B 100 this gt B ee super gt gt Al appel implicite a super super gt gt gt 0b ject ROPE gt gt gt gt CODE 1 exec init gt gt gt a 10 gt gt gt CODE 2 exec init gt gt b 5 gt gt CODE 3 gt b 100 gt CODE 4 B int i this b i CODE 4 FIG 4 5 Exemple succession d appels de constructeurs Les variables d instance introduites par la classe B sont initialis es l aide des affec tations indiqu es dans leur d claration ici b 5 ligne 8 puis le reste du constructeur sans param tre de la classe B continue ligne 10 et retourne Le constructeur avec un param tre de la classe B continue lignes 14 et 15 et retourne L appel new B 100 est enfin termin La figure Fig 4 5 r sume cette succession d appels L insertion par d faut de super dans un constructeur d une classe est faite par le lors de la compilation cela revient exactement crire soi m me super et donc la super classe doit poss der un constructeur sans param tre Nous avons vu que le contructeur par 4 4 Classes
52. MVC 187 class PaintView extends Canvas implements Observer M iis 9 5 1 Minitortues le MVC en action Nous avons appliqu le principe du MVC pour construire un embryon du jeu des tortues java Nous avons construit un programme o des monstres peuvent combattre entre eux sur une carte La figure 9 30 montre le r sultat graphique Les monstres dans ce cas applique chaque tour une strat gie pr f finie Figure 9 30 Minitortues E Minitortues Ef Minitortues La figure 9 31 repr sente le diagramme de classe de notre application Si vous avez bien compris le MVC vous pouvez facilement reconnaitre les diff rent l ment sur ce diagramme Nous avons consid r que la r gion constitue le mod le En effet les monstres se d placent de r gion en r gion en modifiant chaque l tat de la r gion orgine et de la r gion cible Si Pon applique le MVC la r gion chaque fois qu un r gion change d tat elle va avertir sa ou ses vues qui vont revenir lire l tat du mod le et se modifier en cons quence La vue du mod le est repr sent e par une classe interne de la classe r gion 188 Figure 9 31 Diagramme de classe des minitortues Observable from util On lt cinterface gt gt momon Observer util
53. Ty Trois tapes steps sont effect es par le compilateur lorsqu il consid re cette invoca tion de m thode 1 Classe ou interface partir de laquelle la m thode est cherch e C est Forme 1 la classe contenant le code de l invocation Forme 2 la classe ou interface type de lt expression gt Forme 3 la super classe de la classe contenant le code de invocation 2 D termination de la signature de la m thode types des param tres formel appe ler Cette recherche s effectue dans la classe ou l interface d termin e l tape pr c dente Toutes les m thodes h rit es par celle ci sont consid r es par le compilateur Cette tape peut tre d compos e en plusieurs sous tapes a Le compilateur s lectionne toutes les d clarations de m thodes accessibles se lon leur d claration protected private ou visibilit package depuis la classe ou Vinterface applicables au cas de l invocation consid r e m me nombre de pa ram tres types statiques des lt expressionl 2 gt des param tres effectifs affectables aux types des param tres formels method invocation conversion Une restriction s applique ici en aucun cas le compilateur restreint un para m tre effectif entier int vers un param tre formel plus petit byte short char 5 1 M canismes mis en ceuvre 105 b Parmi toutes les m thodes applicables le compilateur en choisi une seule dont la signa
54. acc s dans un tableau deux dimensions Ces classes collections regroupent le plus souvent ce qui fait les beaux jours des cours d algorithmique de toute formation en informatique structures de piles de files de listes chaines de queues avec leurs m thodes d insertions et de tris Dans les langages objets toutes ces structures existent d j dans les biblioth ques de collections Les classes collections sont le plus souvent une construction bas e sur une struc ture de donn es primaire les tableaux La figure 3 58 montre comment nous r ali sons la relation 0 n Carte Region avec un tableau 2 dimensions En java les tableau sont des objets Pour manipuler un objet tableau il nous une r f rence typ e dessus C est l objectif de la d claration Region regions regions est une r f rence sur objet tableau deux dimensions devant contenir des r f rences sur des objets Region Supposons que nous instancions un objet Carte en appelant le constructeur de Carte new Carte 3 3 l tat de la machine virtuelle est celui repr sent dans la fi gure 3 59 La r f rence sur l objet tableau est juste non initialis e Il nous faut maintenant instancier l objet tableau lui m me c est l objectif de new Region nbrow nbcol La figure 3 60 repr sente l tat de la machine virtuelle apr s 74 Classes et objets la pile d appel le tas d objets Carte 3 3 T regions main args
55. agit en mettant une exception la cellule 5 6 n existe pas Si cette exception est lev e alors la clause catch est activ e 3 10 Relations O n 75 la pile d appel le tas d objets tab0 length 3 r00 Region CIRE four tab Carte 3 3 args main args r10 Region r10 Region Da r11 Region E amp E r12 Region EE tab2 length 3 r20 Region r20 Region Ce r21 Region E r22 Region FIG 3 61 Vue m moire d un objet tableau deux dimensions et dans notre cas la m thode se termine en renvoyant null Il faut donc faire attention en utilisant la m thode get Region car elle renvoie soit la region demand e si elle existe null sinon C est l appelant de prendre en compte cette particularit Il est alors extr mement utile de commenter son code pour avertir tout utilisateur de cette m thode de son mode de fonctionnement Nous avons parl d objets tableau Mais comme nous sommes dans une langage de classe si il y a objet il y a une classe permettant d instancier ces objets Ou est la classe tableau deux dimensions de regions Cette classe est en fait g n r e par le compilateur quand il rencontre des d clarations de tableaux Ces classes ne sont pas visibles directement par le programmeur Il est possible de les observer en utilisant la dynamicit du langage La classe Region est tout fait cla
56. armes et armures port es Cet exemple montre bien comment en jouant sur arbre lui m me et les algorithmes de placement nous pouvons r aliser l cran que nous voulons La figure 9 12 repr sente le r sultat l cran le code ci dessous permet d obtenir cet cran import java util import javax swing import java awt class Main public static void main String args Mauhly m new Mauhly affreux 15 25 m setArme new Arme 5 m setArmure new Armure 8 m addEquip new Arme 7 9 3 G rer les v nements le mod le par d l gation 163 m addEquip new Armure 2 Fen tre principale JFrame f new JFrame f getContentPane setBackground Color blue f getContentPane setLayout new BorderLayout Noeud pour Nom vie force JPanel pl new JPanel pl setLayout new GridLayout 0 1 pl setBackground Color cyan pl add new JLabel Nom m getNom pl add new JLabel vie m getVie pl add new JLabel Force m getForce Panel pour les armes et armure JPanel p2 new JPanel p2 setLayout new BorderLayout p2 setBackground Color yellow p2 add new JLabel Arme m getArme BorderLayout WEST p2 add new JLabel new Imagelcon heros gif BorderLayout CENTER p2 add new JLabel Armure m getArmure BorderLayout EAST panel pour visualiser le contenu du sac JPanel p3 new JPanel p3 setBackground Color green JList 1 new
57. ation de m1 m2 m3 La m thodes equals fait son teste l galit des r f rences vers des objets String et non l galit des objets string eux m me Pour que ce m me programme imprime true true il faut r crire la m thode equals de mani re plus ad quate cf figure Bien comprendre la manipulation des r f rences est indispensable Une connais sance partielle des r gles r gissant l affectation le passage en param tre la copie et l galit des r f rences est une source in puisable de malfonctionnement en tous genres 3 7 Encapsulation Acc s aux valeurs private m thode combattre sur un monstre prenant en para m tre un autre monstre 3 7 Encapsulation 67 class Mauhly private String nom private int force private int vie private int exp 10 public Mauhly String nomp int forcep int viep nom nomp force forcep vie viep public boolean equals Mauhly m return nom m nom amp amp force m force amp amp vie m vie amp amp exp m exp M ess class Main public static void main String args Mauhly mi new Mauhly affreux 15 25 Mauhly m2 new Mauhly affreux 15 25 Mauhly m3 new Mauhly new String affreux 15 25 System out printin ml equals m2 true System out printin ml equals m3 false FIG 3 47 ml equals m2 la pile d appel le tas d objets m1 Maulhy s1 String value affreux Point de Vie 15 Exp
58. classe de java Exception et non sous classe de java lang RuntimeException Une telle exception est une exception pour laquelle la pr sence obligatoire d un traitement ad quat sera v rifi par le compilateur checked ex ception De le cas de notre jeu nous pouvons introduire une exception v rifi e Deplace mentHorsDuPlateauException qui sera cr e et lev e par les m thodes d pla ant des monstres ou des joueurs sur les cases du plateau de jeu La classe Except ion poss de deux constructeurs l un sans param tre l autre avec une cha ne de caract re un message associer l exception Dans le cas notre exemple pr sent sur la figure 8 1 nous ne propo sons qu un seul constructeur avec 3 param tres la case partir de laquelle un mouvement incorrect a t tent un entier codant la direction du mouvement fautif nous y reviendrons par la suite et une cha ne de caract res communiqu e la super classe appel super ligne 4 Ceci illustre bien que les exceptions sont des classes comme les autres on peut les sp cialiser pour y ajouter des informations compl mentaires afin de mieux d crire le probl me rencontr Nous avons mis un caract re souslign _ devant le nom de la variable d instance case ligne 10 car case est un mot clef r serv du langage et cause donc de nombreuses erreurs de compilation si il est utilis comme identificateur Figure 8 1 Exemple de classe d exceptions
59. classes dans le m me fichier mais nous nous conformerons aux conventions d criture et de ce fait nous ne d clarerons qu un classe par fichier Le fichier porte le nom exact de classe La classe Maulhy sera donc d finie dans le fichier Maulhy java dont le contenu est d crit dans la figure 3 4 3 2 Les Classes 33 class Mauhly Maa private int force public string force erreur force est deja utilise public int force ok c est une methode return Force public void force erreur force existe deja ae WY class Mauhly FIG 3 3 Conflits de nommage dans une classe La classe Mauhly doit tre consid r e comme une usine fabriquer des ob jets de classe Maulhy on dit des instances de Mauh1 y Je peux donc cr er autant d instances de la classe Mauh1y que je veux tous auront le m me comportement tel qu il est d finit dans la classe et chacun aura ses propres valeurs pour ses variables d instances Supposons que l on c e 3 trois instances de la classe Maulhy que la machine Java attribue les indentit de mani re na ve nous pouvons obtenir trois objets Maulhy1 Maulhy2 Maulhy3 nom Pascal nom G rald nom Laurent Point de Vie 100 Point de Vie 200 Point de Vie 200 Exp rience 41 Exp rience 4100 Exp rience 410 Force 18 Force 21 Force 21 La classe Mauh1y d finit un espace de nommage Deux variables d instance ne peuvent porter le m
60. code ayant permis de cr er cet cran Dans ce code la s l ction de file quit dans le menu permet de terminer application import java util import javax swing import java awt import java awt event class Quit implements ActionListener public void actionPerformed ActionEvent e System exit 0 class Main public static void main String args Mauhly m new Mauhly affreux 15 25 m setArme new Arme 5 m setArmure new Armure 8 m addEquip new Arme 7 m addEquip new Armure 2 Fen tre principale JFrame f new JFrame f getContentPane setBackground Color blue f getContentPane setLayout new FlowLayout JMenuBar jmb new JMenuBar JMenu jmfile new JMenu File JMenultem quit null jmfile add quit new JMenultem Quit quit addActionListener new Quit 9 3 G rer les v nements le mod le par d l gation 175 JMenu jmhelp new JMenu Help jmhelp add new JMenultem About jmb add jmfile jmb add jmhelp f set MenuBar jmb Noeud pour Nom vie force JPanel pl new JPanel pl setBackground Color cyan JTextField jnom pl add jnom new JTextField m getNom jnom addActionListener new ChangeName m pl add new JLabel vie m getVie pl add new JLabel Force m getForce Panel pour les armes et armure JPanel p2 new JPanel p2 setBackground Color yellow JButton jarme ja
61. d v nement Conna tre son principe de fonctionnement permet de programmer en java sans pour autant conna tre par coeur la librairie graphique Il est en effet possible de d duire que forc ment tel composant graphique doit fournir telles m thodes et qu une interface de type Listener doit exister avec tel type de m thodes La figure 9 13 montre un fragment du digramme de classe de la librairie graphique Figure 9 13 producteurs et consommateurs d v nements EventListenerList from event Ia dd t Class EventListener void Bremove t Class I EventListener void listenerList JComponent from swing EventListener from util WindowListene ActionListener indowListener from event WindowEvent romeo a BvindowOpened e WindowEvent void BactionPerformed e ActionEvent void BindowClosing e WindowEvent void BwindowClosed e WindowEvent void from event TE B amp windowlconified e WindowEvent void PEEN 7 P BwindowDeiconified e WindowEvent void nee e BwindowActivated e WindowEvent void modifiers int fomen BwindowDeactivated e WindowEvent void BBparamString String T AWTEvent from awt EventObject from util 8EventObject source Object BgetSource Object BoString String Le programme suivant mont
62. d instances qui caract rise l tat de l objet en private et les m thodes qui caract rise son comportement comme public Toutes les m thodes d instances n ont pas tre publiques certaine peuvent tre r serv e pour usage interne et donc tre d clar e comme private Java est un langage typ Toute d finition de variable doit tre typ e L objectif essentiel de cette d finition est de faire du contr le de type C est une des fonctions 3 2 Les Classes 35 du compilateur Quand nous allons compiler ce programme afin de g n rer un pro gramme ex cutable le compilateur va bien sur v rifier la syntaxe du programme mais aussi la coh rence des types Si il d tecte par exemple lors d une affectation qu un nombre r l est affect un entier il va signaler cette incompatibilit de type Nous verrons plus loin que la coh rence des types est un l ment fondamental du langage Il faut toutefois tre attentif la mani re dont est r alis l encapsulation Le prin cipe d encapsulation dit que pour acc der l tat d un objet il faut absolument passer par les m thodes de son interface Ici l encapsulation r alis en java un sens un peu diff rent En effet la variable d instance force d une instance de Mauh1 y sera ac cessible non seulement cet objet mais aussi par tous les objets de m me classe C est une encapsulation bas e sur les classe D autres langages objets comme S
63. d invoquer la m thode de la classe indiqu e partir du code de n importe quelle autre classe la notation lt expression retournant une r f rence un objet gt lt nom de m thode gt Dans ce cas la m thode invoqu e sera celle du type statique de l expression utilis e une classe d termin e lors de la compilation la r f rence pr d finie super Dans le cas du code d une m thode d instance d un 88 L h ritage constructeur du code d initialisation d une variable d instance ou d un bloc anonyme d initialisation non static d une sous classe cette r f rence permet d invoquer les m thodes de classe de la super classe Dans ce cas finalement seule le type statique asso ci super la compilation nous int resse l objet r f renc par super le m me que this ne sera pas acc d l ex cution super permet donc d acc der une m thode statique partir de tout comme li une instance Le programme de la figure 4 7 et son ex cution de la figure 4 4 mettent en valeur qu un appel une m thode statique masqu e ou non est r solu statiquement la compilation Cet exemple n est pas li au jeu car finalement on masque assez rarement Les lignes 1 5 de cet exemple d finissent une classe A contenant juste une m thode de classe m qui affiche A m A partir de la ligne 6 est d finie la classe B sous classe de A Elle pr sente lignes 7 9 une m thode de cla
64. dans une machine virtuelle donn e Il faudrait utiliser le pattern singleton pour cette fabrique cf 3 9 configl 136 Les packages moteur from tortueJava Monstre setVie combattre lt lt Interface gt gt FabrqueDeM onstres fabriquerUnM onstre confi A from tortueJava from config 1 se a yee Handrey from config1 FIG 7 1 Diagramme de classe d un exemple de pattern abstract factory Participant du pattern classe java de l exemple AbstractProductA Monstre ProductAl Mhaziny ProductA2 Mauhly ProductA3 Handrey AbstractFactory FabriqueDeMonstres ConcreteFactory1 LeLoria TAB 7 1 Correspondance entre les composants du pattern abstract factory et les classes li es aux monstres 7 4 Exemples Figure 7 3 Monstres et fabriques abstraites package fr loria tortueJava moteur public abstract class Monstre protected Monstre int viep vie viep public void setVie int viep this vie viep public abstract void combattre Monstre ennemi private int vie package fr loria tortueJava moteur public interface FabriqueDeMonstres Monstre fabriquerUnMonstre package fr loria tortueJava config import fr loria tortueJava moteur Monstre class Mhaziny extends Monstre Mhaziny super 10 public void combattre Monstre ennemi ennemi setVie 0 package fr
65. de classe Mauhly ie cr en utilisant cette classe comme mod le Chaque op ration d finie dans cette section est appel e m thode d instance c est dire une m thode pouvant tre appel e sur un objet de classe Mauh1 y 67 fin de la d finition de la classe Mauhl1 y public int getVie return vie private void setVie int viep vie viep public void reposer setVie getVie 10 ies class Mauhly FIG 3 2 La classe Mauhly vue g n rale 3 2 Les Classes Les objets monstre sont assez similaires l objet h ros Les monstres ont le m me tat la m me interface de comportement mais la diff rence du h ros ils sont autonomes ils d cident d eux m mes si ils doivent se d placer boire un potion ou changer d armes Tous les monstres de type maulhy appartiennent la m me classe La structure de leur tat est la m me le comportement de chaque maulhy est indentique Dans un langage de classe comme Java C Eiffel avant de cr er les objets il faut d finir les classes de ces objets Ces classes contiennent la d finition de l tat et du comportement Nous allons d finir progressivement la classe Maulhy qui va permettre de cr er les objets maulhy1 maulhy2 En java la d finition des classes est contenue dans des fichiers avec l extension java Il est possible de d finir plusieurs
66. de l op rateur new et expressions de transtypage cast Par contre si le mot clef public ne pr c de pas la d claration d une classe ou interface alors elle ne pourra tre utilis e que par des unit s de compilation du m me package Il faut bien noter que se n est pas parcequ une classe n est pas accessible partir d une unit de compilation que cette derni re ne pourra pas manipuler d instances dont le type dynamique est cette classe Le contr le d acc s ne lui permettra pas cependant d y acc der avec des r f rences du type statique de cette classe Ce point sera illustr dans l exemple du cf 7 3 2 Acc s aux l ments d une classe Sans utiliser les mots clefs public protected ou private lors de sa d finition une variable ou m thode d instance ou classe ne peut tre acc d e qu partir de code appartenant des classes du m me package L introduction de la notion de package ne modifie en rien ce qui a t dit propos de l influence du mot clef private cf 4 6 1 Par contre nous devons compl ter ce qui a t dit propos du mot clef protected cf 4 6 2 En effet l acc s package prime sur protected En d autre terme une classe peut utiliser des variables ou m thodes d clar es dans une autre comme protected du moment qu elle soit dans le m me package qu elle soit sous classe de la deuxi me ou non On peut donc conclure dire que le fait de grouper
67. de placement ArmeiT Armure 2 Arme 7 Armure 2 Nous reprenons l exemple de visualisation de l tat du h ros Chaque noeud de l arbre de composant graphique va d l guer le gestion du placement un algorithme de placement La figure 9 9 repr sente quel algorithme de placement est associ chaque noeud La figure 9 10 repr sente le r sultat l cran Le code suivant permet de cr er cet cran import java util import javax swing import java awt 9 2 Construire un cran graphique le mod le composite 161 class Main public static void main String args Mauhly m new Mauhly affreux 15 25 m setArme new Arme 5 m setArmure new Armure 8 m addEquip new Arme 7 m addEquip new Armure 2 Fen tre principale JFrame f new JFrame f getContentPane setBackground Color blue f getContentPane setLayout new BorderLayout Noeud pour Nom vie force JPanel pl new JPanel pl setLayout new GridLayout 0 1 pl setBackground Color cyan pl add new JLabel Nom m getNom pl add new JLabel vie m getVie pl add new JLabel Force m getForce Panel pour les armes et armure JPanel p2 new JPanel p2 setLayout new BorderLayout p2 setBackground Color yellow p2 add new JLabel Arme m getArme BorderLayout WEST p2 add new JLabel new Imagelcon heros gif BorderLayout CENTER p2 add new JLabel Armure m getArm
68. elle a donc l unique signature valide le compilateur ne peut affecter A vers B r duction ounarrowing afin de s lectionner l autre m thode Le cas de la deuxi me invocation est un peu diff rent B peut tre affect e vers sous classe vers super classe widening les signatures des deux m thodes peut tre s lectionn es Par contre pour la m me raison que pr c demment la m thode de la ligne 9 est plus sp cifique que celle de la ligne 6 c est donc elle qui est r ellement appel e La figure 5 1 donne le r sultat de l ex cution de cet exemple On y voit clairement que les deux m thodes sont appel es 5 2 Quelques exemples d erreurs li es aux m canismes d invocation 107 FIG 5 1 Ex cution de l exemple 5 1 Figure 5 1 D termination de la signature d une invocation et type statiques des pa ram tres effectifs class A class B extends A class Test void m A a System out printin A void m B b System out println B static public void main String args Test t new Test B b new BOQ A a b t m a t m b 5 2 2 Informations g n r es la compilation et modification ul t rieurs des classes Java est suppos tre pratique pour mettre en uvres de librairies packages ind pen dants cf distribu s par diff rentes producteurs ou vendeurs En effet une modification dans un package si elle ne modifie pas les acc s publiques de celui ci
69. en haut de la hi rarchie Lorsque que l on crit cela revient class extends Object Cette classe Object est pr d finie par java et vient avec le package java lang cf Elle forme donc une racine commune tous les arbres d h ritage entre classes que l on peut former en Java Cette classe fournit des m thodes li es l implantation des instances et au probl mes de synchronisation lorsque que plusieurs activit s threads acc dent un m me objet Certaines m thodes peuvent tre surcharg e dans les sous classes Une m thode tr s souvent surcharg e des fin de mise au point est la m thode toString Elle est sens e renvoyer une repr sentation textuelle concise mais repr sentative de l objet dixit la documentation du jdk Dans le cas de la classe Equipement et ses sous classes il suffit de reprendre ce qui a t propos pour les m thodes print Fig 4 14 Gr ce la liaison dynamique toutes les m thodes utilisant toSt ring comme les m thodes affichant les erreurs et les exceptions utiliseront la m thode toSt ring ainsi sp cialis e C est aussi le cas de la m thode print 4 7 Laclasse Object 101 de Equipement qui a t r crite simplifi e et qui n a plus a tre surcharg e dans chaque sous classe la surcharge de toString suffit La figure 4 15 illustre ce dernier point pour la classe Protection Figure 4 14 Surcharge de la m thode toString de Object
70. endroit dans tmp Pour ex cuter le programme ainsi g n r la proc dure main est dans la classe TestFabrique2 on peut utiliser la commande en ligne java classpath tmp TestFabrique2 fr loria tortueJava configl LeLoria 142 Les packages 8 Exceptions et entr es sorties 144 Exceptions et entr es sorties 8 1 Id e de base Java propose un m canisme d exception pour traiter les cas d erreurs d s ala mauvaise utilisation de la machine virtuelle ou des classes pr d finies classes introuvables acc s incorrect dans un tableau division par z ro des cas anormaux l ex cution plus de m moire disponible canal de communica tion ferm de mani re impromptue Ce m canisme est extensible au code de l utilisateur le programmeur peut d finir ses propres exceptions pour que les utilisateurs de ses classes et packages puissent g rer les erreurs d une mani re uniforme Lorsque qu une exception surgit le flot normal des instructions du programme n est plus suivi La machine virtuelle cherche dans la pile l ex cution un bout de code install par le programmeur succeptible de traiter le probl me Les motivations principales du choix d un syst me d exception tr s complet dans java page 201 Lesson Handling Errors with Exceptions sont Forcer le programmeur prendre compte m me de mani re simple les erreurs se produisant dans son code En effet
71. est pas instanciable Bien entendu si A est une classe abstraite l op rateur new ne peut pas lui tre appliqu Mais si B est une classe non abstraite d riv e de A toute instance de B peut aussi tre vue comme une instance de A l op rateur binaire instanceof renvoie true dans les cas cf 4 5 Classes m thodes et attributs finaux 97 L astuce pr conis par 8 6 8 pour qu aucune instance ne puisse tre d riv e partir d une classe est de d finir un unique constructeur private pour celle ci L op rateur new ne peut alors pas tre utilis de l ext rieur et aucune sous classe ne peut tre d finie car ses ventuels constructeurs ne pourraient faire appel ce constructeur priv cf 4 6 1 Ceci n emp che pas la classe de cr er elle m me des instances et de transmettre leurs r f rences vers l ext rieur dans des m thodes de classes Pour tre encore plus restrictif la classe peut aussi tre d clar e comme abstraite m me si elle ne poss de pas de m thodes abstraites qui ne pourraient d ailleurs pas tre impl ment es dans les sous classes Ainsi l utilisation de new sera aussi impossible dans le code de la classe elle m me L exemple de la figure 4 12 applique ces deux astuces une classe A lignes 1 et 2 La figure 4 7 donne des erreurs de compilations obtenues lorque l on essaie de d river d instancier la classe abstraite A m me a partir d elle m me lignes 1
72. ex cution Dans le cas restant la r f rence est le r sultat de l valuation de lt expression gt 2 valuation des arguments Les expresions lt expressionl 2 3 gt sont va lu es dans cet ordre de gauche droite 106 La liaison dynamique 3 V rification d acc s la m thode m en fonction du code code faisant l invocation et de la d claration de la m thode public protected 4 Localisation de la m thode invoquer C est la liaison dynamique proprement dite puisque que nous nous sommes plac dans le cas d une m thode d instance non priv e La m thode m appeler va tre recherch e dans l arbre d h ritage partir d un point qui d pend de la forme de l invocation Formes 1 et 2 recherche partir du type dynamique de l objet r f rence par la r f rence calcul e en 1 C est la classe utilis e lors de l appel new utilis pour cr er cet objet Il faut bien faire attention m me si la r f rence consid r e est this le type dynamique peut tr s bien tre celui d une sous classe de la classe du code o this est utilis Forme 3 recherche partir de la super classe de la classe qui contient le code de l invocation Une fois cette classe de d part d termin e la m thode m avec la signature et le type de r sultat calcul statiquement cf 5 1 1 y est recherch e Si elle n y est pas trouv e cette recherche est r p t e a partir de la sup
73. gestion des TreeModeListener qui sont en fait les vues du mod le dont le compo sant JTree fera partie Une interface pour permettre au composant JTree de parcourir le composite Ce sont les m thodes getChild L implantation de ces m thodes nous impose de modifier un 9 6 Graphisme 2D les bases 193 minimum le mod le composite Tous les l ments du composite doivent impl menter isLeaf et r pondre oui si il s agit d une feuille et non si il s agit d un noeud La m thode isLeaf de la classe quipement implante cette m thode en r pondant syst matiquement oui Cette m thode est red finie dans Sac pour r pondre non Un point d entr e pour commencer le parcours d arbre getRoot Nous avons implant grossi rement l interface TreeModel Lorsque le composite change le composite appelle la m thode reload qui redessine entri ment l arbre graphique Il est possible de g rer cela plus finement en ne redessinant que le sous arbre ayant chang 9 6 Graphisme 2D les bases Figure 9 34 Minitortues version 2D Ei Minitortues Le graphique 194 Figure 9 35 Minitortues elles bougent 9 6 Graphisme 2D les bases 195 import javax swing import java awt event import java util import java awt class Region extends Observable relation inverse de la Carte Region 1 1 private Carte carte private int x p
74. jeu et des points de vie hp De la m me fa on un monstre est caract ris par un coefficient de force force des points d exp rience exp et des points de vie hp Il peut galement porter une armure une arme de poing et un sac Les diff rents monstres sont L Handray Le Mh ziny Le Mauhly Les acteurs se d placent d une case la fois sur une des huit cases adjacentes celle o ils se trouvent un instant donn Si la case d arriv e contient des objets des armes ou un sac l acteur peut les ramasser pour les mettre dans son sac Si elle contient un autre acteur le d placement revient 4 porter un coup a ce dernier en utilisant l arme port par acteur qui se d place Franchir une porte permet au h ros d augmenter ses points d exp rience de 15 pour cent et de remonter sa vie au maximum 2 1 Les tortues java 23 Les armes Une armure et un bouclier sont caract ris s par un coefficient de protection prot une arme par un coefficient de destruction destr Ces coefficients sont constants ils ne peuvent pas varier au cours du jeu Il existe deux types d armures en airain et en acier de coefficients respectifs 2 et 4 trois types de boucliers en bois en airain et en acier de coefficients respectifs 1 2 et 3 et trois types d armes la massue le glaive et la hache de coefficients respectifs 2 4et 6 Les objets Un sac a une capacit illimit e Il permet de po
75. l exemple Component Equipement Composite Sac Leaf Protection Potion et sous classes TAB 4 1 Correspondance entre les composants du pattern composite et la classe Sac concr tes Introduisons un nouvel quipement un peu sp cial un sac pouvant contenir des quipements Un sac tant lui aussi un quipement sa valeur et sa masse sont calculer Elles le seront partir des m thodes d clar es comme abstraites dans la classe Equipement qu il peut ap peller sur les l ments qu il contient La classe Sac a donc faire un ensemble polymorphe d quipements Armure PotionDeVie mais dont il fait un usage homog ne gr ce aux m thodes abstraites d clar es au niveau de la classe Equipement Le diagramme de classe ULM de la figure 4 1 est donc un peu tendu par le diagramme de la figure 6 2 Notre sac est l application du pattern composite 163 Utilis avec la correspondance indiqu e dans la table 7 1 Le code java correspondant est donn dans la figure 4 11 De mani re assez naturelle la classe Sac n est pas d clar e comme abstraite un sac est un quipement parfaitement d fini et utilisable en temps que tel Les m thodes abstraites de la classe Equipement y 96 L h ritage sont compl tement impl ment es Il faut par contre remarquer qu un sac per oit les objets qu il contient comme de simples objets de la classe Equipement les l ments du tableau contient ligne 2 Bie
76. la sous classe conduit obligatoirement l ex cution de cette nouvelle m thode d finie dans la m thode Reprenons l exemple de la classe Equipement et de ses sous classes Nous y introdui sons Fig 4 4 pour des fins de mise au point une m thode void print qui affiche les caract ristiques d un quipement c est dire sa masse et sa valeur 4 3 Relation avec les l ments constituant une classe 85 Figure 4 4 La classe Equipement avec une m thode print public class Equipement int masse int valeur int getMasse return masse void setMasse int masse this masse masse int getValeur return valeur void setValeur int valeur this valeur valeur void print System out printin Equipement masse getMasse valeur getValeur Si nous ne modifions pas les sous classes Arme Protection lorsque la m thode print est appel e sur une instance de l une d entre elles c est la m thode print qui vient d tre d finie dans Equipement qui sera ex cut e En d autres termes la m thode print ainsi d finie sera celle appel e pour toute instance d objet cr e par un new Equipement new Protection ounew Arme le type dynamique de l ins tance consid r e Ce n est pas faux mais on pourrait tre plus pr cis On peut par exemple surcharger la m thode print de laclasse Protection afin de faire apparaitre en plus les propri t s prop
77. m thodes correspondent au cas de surcharge d une m thode d instance cf 4 3 1 c est a dire m me nom et m me liste de types pour les param tres formels toutes ces d clarations compte pour une et ainsi une classe n aura fournir qu une fois le code pour les d clara tions de m thodes ainsi h rit es Dans ce cas toutes les d clarations et la d finition effective doivent avoir le m me type de r sultat cf 4 3 5 Dans le cas contraire le compilateur g n re une erreur comme quoi les m thodes avec la m me signature nom et types des param tres doivent avoir le m me return type 6 5 4 H ritage multiple d une m me interface Il est parfaitement possible qu une interface h rite plusieurs fois d une autre interface ou qu une classe doive implementer plusieurs fois une m me interface Ces cas ne pose aucun probl me les d clarations de m thodes de l interface vue plusieurs fois ont bien videm ment la m me signature et sont donc regroup es deux deux Les constantes elles sont vue une seule fois elles proviennent de la m me interface avec les m mes expressions d initiali sation il n y a donc aucune possibilit d ambigu t Ce cas est proche de l h ritage virtuel en C On voit que finalement les restrictions faites sur les interfaces permettent un h ritage multiple limit sans introduire de situtations subtiles 6 6 Exemple dans la biblioth que standard java Les bi
78. n est pas pris en compte Le compilateur javac demande que les fichiers sources des classes et interfaces soient rang s dans une arborescence de r pertoires refl tant la structures des packages Une autre option d permet de g n rer les fichiers class dans une arborescence similaire mais s par es des sources Nous avons incitons consulter la documentation html des outils du jdk et de toute fa on attendez vous quelques oublis et nervements concernant le classpath et ses amis Signalons aussi que le jdk fournie la commande jar pour cr er des jarfiles Cette com mande a des options tr s proche de la commande tar d Unix L aussi les pages htlm de la documentation du jdk donnent toutes les pr cisions n cessaires y compris sur les aspects formats de fichiers signatures lectroniques et manisfestes de distribution 7 5 1 Application exemple cf 7 4 1 Dans le cas des exemples de la section pr c dente nous avons dans le r pertoire courant Varborescence suivante Sls R TestFabriquel java TestFabrique2 java TestTabDyn java Ere loria fr loria tortueJava fr loria tortueJava configl moteur util fr loria tortueJava configl Handrey java LeLoria java Mauhly java Mhaziny java 7 5 Stockage des package CLASSPATH et autres d tails 141 fr loria tortueJava moteur FabriqueDeMonstres java Monstre java fr loria tortueJava util TabDyn java Pour compiler le deuxi
79. par d faut ajout e la liste contenue dans la variable CLASSPATH Par exemple la ligne 9 de la figure 1 2 montre que la classe String a t charg e a partir d un fichier rt jar Comme les classes de la biblioth que sont fort nombreuses elles sont compres s es dans des fichiers d archive d extension jar selon le m me principe que celui 18 La conception de logiciel de l outil zip disponible entre autres sous Windows Il est possible de conna tre le contenu d un fichier d archive grace l outil jar Fig 1 3 Figure 1 3 Le contenu du fichier d archive rt jar jar tvf local langages Java solaris jdk1 2 2 jre lib rt jar 0 Tue Jun 29 05 00 36 CEST 1999 META INF 2177 Tue Jun 29 05 00 36 CEST 1999 META INF MANIFEST MF 0 Tue Jun 29 03 48 34 CEST 1999 com 0 Tue Jun 29 04 59 50 CEST 1999 com sun 0 Tue Jun 29 04 03 06 CEST 1999 com sun java 0 Tue Jun 29 04 03 06 CEST 1999 com sun java swing 0 Tue Jun 29 04 03 28 CEST 1999 com sun java swing plaf 0 Tue Jun 29 04 03 48 CEST 1999 com sun java swing plaf motif 1348 Tue Jun 29 04 03 06 CEST 1999 com sun java swing plaf motif MotifButtonListener class 2814 Tue Jun 29 04 03 06 CEST 1999 com sun java swing plaf motif MotifButtonUL class 1684 Tue Jun 29 04 03 08 CEST 1999 com sun java swing plaf motif MotifBorders class dont les diff rentes options sont d crites dans la documentation accompagnant le kit de d veloppement Java Les a
80. parenth ses getVie 10 et commencer par appeler la m thode get Vie qui va retourner 0 cf figure Il ne reste plus qu a ex cuter la m thode set Vie 0 10 On empile la m thode setVie la pile d appel le tas d objets Maulhy1 Maulhy setVie 10 nom null Point de Vie 0 momo Ed Exp rience 0 Force 0 FIG 3 18 Mauhly momo new Maulhy 3 4 Instanciation et constructeur 49 la pile d appel le tas d objets Maulhy1 Maulhy nom nul momo 4 Point de Vie 10 Exp rience 0 Force 0 FIG 3 19 Mauhly momo new Maulhy 6 L ex cution de la m thode set Vie a pour effet de modifier l tat de l objet mauhly1 cf figure 3 4 Instanciation et constructeur Jusqu pr sent l tat initial de l objet est fonction des valeurs par d faut du compilateur et expressions d initialisation fournies dans la d finition de la classe Supposons que je veux maintenant fixer l tat initial d un objet en fournissant des param tres lors de sa construction Par exemple j ai envie de cr er un monstre de force gale 10 de vie gale 100 et de nom affreux Bien videmment je peux cr er un objet monstre et fixer ensuite chacune de ses caract ristiques en passant par les modificateurs i e setVie setExp Le programme principal ressemble alors a public static void main String args Mauhly momo new Mauhly momo set Vie 1
81. permet de rendre notre composite conforme au mod le attendu par le composant JTree import javax swing tree import java util import javax swing event class SacRoot extends Sac implements TreeModel private Vector v new Vector SacRoot public void addTreeModelListener TreeModelListener 1 192 Le graphique v addElement public Object getChild Object parent int index if Equipement parent isLeaf O return null else return Sac parent getEquip get index public int getChildCount Object parent if Equipement parent isLeaf return 0 else return Sac parent getEquip size 0 public int getIndexOfChild Object parent Object child if Equipement parent isLeaf return 0 else return Sac parent getEquip indexOf child public Object getRoot return this public boolean isLeaf Object node return Equipement node isLeaf public void removeTreeModelListener TreeModelListener 1 v removeElement 1 public void valueForPathChanged TreePath path Object newValue public void reload System out println yo TreeModelEvent event new TreeModelEvent this new TreePath this for Enumeration e v elements e hasMoreElements TreeModelListener 1 TreeModelListener e nextElement 1 treeStructureChanged event La classe SacTree fournit la
82. peut se faire sans modification ou recompilation des codes des classes clientes ext rieures au package Mais les m canismes d crits dans la section pr c dente peuvent introduire de subtils probl mes l ex cution pas r ellement naturels pour le programmeur Explication du probl me et effets La signature de la m thode chercher lors d une liaison dynamique est conserv e dans le code g n r pour une expression d invocation donc souvent dans le code d une classe cliente de la classe qui poss de la m thode vis e En cas de modifications de cette derni re le code g n r pour l invocation ne donc aucune raison pour tre modifier Illustrons ceci sur un exemple simplification extr me de l application du pattern visi tor pr sent la section 6 7 Consid rons les classes et le programme de test de la figure 108 La liaison dynamique Arme accept visiter Equipement FIG 5 2 Ex cution de l exemple 5 2 5 2 L ex cution du programme Test est donn e sur la figure 5 2 Cette ex cution n a rien d tonnante la ligne 22 est bien l invocation de la m thode d instance accept de la classe Arme puisque la r f rence a contient bien une r f rence vers l objet de type dynamique Arme cr la ligne 21 La m thode accept concern e fait un appel la m thode d ins tance visiter de la classe Visiteur ligne 15 La seule m thode s lectionnable pour cette invocation a pour signatur
83. potion Nous pouvons introduire une interface sp cifiant ce que doit tre capable de faire un objet portable par le joueur sur diff rentes parties de son corps Du point de vue des notations UML cette interface peut s introduire comme indiqu sur la figure 6 1 Les interfaces sont des st r otypes UML bas s sur les classes abstraites Ce st r otype est d fini dans la sp cification de base core package page 2 36 de UML Le fait qu une classe fournit ce que sp cifie une interface implements en java se repr sente par une association de r alisation o la classe est la source et l interface la destination d une fl che en pointill avec un triagle blanc Un certain nombre de relations lient un joueur des objets portables L interface Portable sp cifie les m thodes pour acc der ces relations c t objet port Elle fournit aussi des constantes pour d signer les emplacements mains dos tibias sur lequels un joueur peut porter un objet La d finition en java l interface Portable est repr sent e sur la figure Figure 6 1 L interface Portable en java abstract interface Portable public static int NON_PORTE 0 int MAIN_DROITE 1 int MAIN_GAUCHE 2 int DOS 3 Joueur getPorteur public abstract int getEmplacement void porterMaintenant Joueur j int en Pour que le joueur puisse porter des armes la main il faut que la classe Arme imple mente cette interface cela donne le code
84. pour impl menter les fameux hotels restaurants en java Tout comme on parle de super classes classes pour les classes h rit es par une classe on parle de super interfaces Les compilateurs v rifient qu il n y a pas de cycles dans le graphe d h ritage des inter faces 6 5 2 Interfaces et masquage ambigu t Une interface h rite de toutes les constantes d finies dans ses super interfaces Les r gles de masquages sur les variables d une classe cf 4 3 5 s appliquent aussi sur les constantes d finies dans les interfaces Une classe impl mentant une ou des interfaces h ritent des d finitions de constantes introduites par celles ci et bien nentendu les r gles s appliquent aussi Le m canisme de masquage ne suffit pas pour viter des situations de notations am bigues d acc s aux constantes Ceci ne limite absolument pas les constructions d interfaces et classes par h ritage et r alisation Il peut juste se produire des erreurs de compilation lorsque l on utilise la notation lt nom de constante gt pour acc der une constante de m me nom h rit e simultan ment de deux ou plusieurs interfaces ou classes Pour lever l ambigu t il suffit d utiliser la notation lt Nom de classe ou interface gt lt nom de constante gt Nous allons donner un exemple volontairement artificiel pour rester simple et bien fo caliser sur le probl me Consid rons les deux interfaces et la classe de la figure 6 3 dont le di
85. public class Equipement int masse int valeur int getMasse return masse void setMasse int masse this masse masse int getValeur return valeur void setValeur int valeur this valeur valeur public String toString return Equipement masse getMasse valeur getValeur final void print System out printin this toString Figure 4 15 Utilisation de la surcharge de la m thode toString de Object public class Protection extends Equipement int coefProtection int getCoefProtection return coefProtection void setCoefProtection int coef this coefProtection coef public String toString return Protection getValeur coefficient de protection getCoefProtection _C super toString Les m thodes de synchronisations wait notify notifyAll correspondent aux acc s un moniteur li l instance consid r e ne doivent en aucun cas tre modifi es elles sont d ailleurs d finies comme final cf 4 5 2 Une autre m thode final de la classe Object est la m thode getClass qui retourne la classe c est dire le type dynamique de l instance consid r e Pour tre pr cis cette m thode retourne une instance de la classe Class qui contient toute la description du type R cuper la classe d une instance peut tre utile des fins de mise au point mais aussi pour utiliser des m canismes sophistiqu s d appel
86. qu des m thodes de classe Voyons ceci un exemple sur une volution de la classe Equipement pr sent sur la figure 4 9 Nous avons rendu abtraites les m thodes relatives la valeur et la masse d un quipement lignes 2 et 3 En effet ses caract ristiques peuvent varier selon l usage de l objet pendant le jeu et donc il faut conna tre plus pr cis ment la nature d un objet pour conna tre sa masse et sa valeur Il faut bien noter que si une classe poss de au moins une m thode abstraite elle doit tre elle aussi d clar e tre comme abstraite Ceci s crit en java en faisant pr c der le mot clef class du mot clef abstract lors de la d finition de la classe 94 L h ritage Figure 4 9 Un exemple de classe abstraite public abstract class Equipement abstract int getMasse abstract void setMasse int masse abstract int getValeur abstract void setValeur int valeur public String toString return Equipement masse getMasse valeur getValeur void print System out printin this toString La figure 4 10 donne une implantation effective des m thodes abstraites de la classe Equipement pour une Potion Ceci est fait en surchargeant lignes 6 9 10 et 13 les m thodes d clar es comme abstraites dans l exemple pr c dent Dans ce cas la masse de T quipement une fiole de potion varie selon l tat l objet la variable d instance bue ligne 11
87. r f rences Le programme de la figure 3 34 illustre les probl mes li s l affectation des r f rences 3 6 R f rences 57 class Mauhly public void setArme Arme arme private String nom this arme arme private int force private int vie private int exp 10 public Arme getArme return arme private Arme arme null private Armure armure null public void setArmure Armure armure public Mauhly String nomp this armure armure int forcep int viep nom nomp public Armure getArmure force forcep return armure vie viep FIG 3 29 Construire des r seaux d objets Armure armure prot int 0 BA mure prot int BgetProt int EisetProt prot int void Mauhly Borce int Bie int exp int 10 BMauhiy nomp String forcep int viep int Main etArme arme Arme void BgetArme Arme Bmain args String void BsetArmure armure Armure void BgetArmure Armure BgetVie int EisetVie Viep int void Breposer void Ame Bidestr int 0 arme Arme destr int k WBgetDestr int BisetDestr destr int void FIG 3 30 Diagramme de classe La figure 3 35 illustre l tat de la machine juste avant d ex cuter m1 m2 La figure 3 36 illustre l tat de la machine juste apr s l ex cution de m1 m2 Il faut bien compr
88. return exp SE public int getVie return vie eens reset ed vie viep public void reposer setVie getVie 10 Vf lt lt class Mauhly int int ie int eposer void FIG 3 7 Correspondances Java UML de r pertoires et sous r pertoires et forment des espaces de nommage En Java Ils sont appel s package Nous verrons plus tard que les packages sont plus que juste des espaces de nommage pour classes mais pour l instant cette vision nous suffit La classe String fait partie du package java util Elle ne s appelle pas String mais java lang String Des m canismes que nous d taillerons ult rieurement nous permettent de l appeler juste String dans notre cas La figure 3 7 illustre les correspondances entre java et UML Elle montre com ment une r f rence en java de la classe Mauh1 y de type St ring se mat rialise en UML par une relation ici unidirectionnelle Nous montrerons d autre type de rela tions plus tard Dans cette section nous avons tudi la d finition d une classe Une classe contient la d finition permettant d instancier une multitude d objet de m me classe Dans un langage de classe les classes existent avant les objets Pu sieurs d finitions principe et l ments de vocabulaire sont importants Variables et m thodes d instance Param tres formels param tres effectifs valeur de retour
89. rience 0 Force 25 Point de Vie 10 Exp rience 0 Force 30 m3 Maulhy args Point de Vie 10 Exp rience 0 Force 30 s2 String value affreux FIG 3 48 Equal ou presque 68 Classes et objets class Mauhly private String nom private int force private int vie private int exp 10 public Mauhly String nomp int forcep int viep nom nomp force forcep vie viep equals pour les r f rences pour les type primitifs public boolean equals Mauhly m return nom equals m nom amp amp force m force amp amp vie m vie amp amp exp m exp Maa FIG 3 49 ml equals m2 class Mauhly private String nom private int force private int vie private int exp 10 public Mauhly String nomp int forcep int viep nom nomp force forcep vie viep public void combattre Mauhly ennemi La bonne fa on de faire ennemi set Vie ennemi getVie this force Le mauvais cot d une encapsulation bas e sur les classes ennemi vie ennemi vie this force Msi FIG 3 50 Encapsulation bas e sur les classes 3 8 Mort des objets Ramasse miettes 69 la pile d appel le tas d objets all uneclasse al2 uneclasse a21 uneclasse GE A a31 uneclasse a32 uneclasse FIG 3 51 Etat de la machine virtuelle un instant donn al3 uneclasse Cf al3 uneclasse CIE
90. this notifyObservers public JComponent display JComponent c new IHM ajouter la vue dans la liste des observeurs this addObserver Observer c return c class IHM extends JLabel implements Observer private Imagelcon herbeicon new Imagelcon images herbe gif private Imagelcon mauhlyicon new Imagelcon images mauhly gif public IHM update Region this null appel en cas de changement d tat du mod le public void update java util Observable o Object arg if mauhly null this setIcon herbeicon 190 Le graphique else this setlcon mauhlyicon 9 5 2 Le MVC dans Swing Nous avons montr deux exemples ou nous avons compl tement g r le MVC par nous m me Le MVC est lui m me tr s pr sent sp cialement dans librairie graphique Swing Les composants graphiques de la librairie graphique sont con us comme des vues de mod les g n riques auquel le programmeur doit se conformer pour pouvoir les utiliser Nous prenons l exemple du composant graphique arbre qui est tr s repr sentatif Nous avons revisit l exemple de l cran de visualisation du h ros en consid rant que le sac peut contenir un autre sac C est l exemple type du mod le par composition De ce fait il possibre de constuire des hi rarchie de sac qui peuvent tre facilement visualis e dans un arbre cf figure 9 32 Figure 9 32 Visualiser des arbres
91. une vue class Mauhly extends Observable String nom private private private private private private private int force int vie int exp 10 Arme arme Armure armure Vector equip new Vector Le graphique 9 5 Principe du MVC public Mauhly String nomp int forcep int viep nom nomp force forcep vie viep public void setArme Arme arme this arme arme this setChanged notifyObservers public void unsetArme this addEquip this getArme this setArme null Hote public Component View return new View public Component paintView return new PaintView class Controller extends JPanel implements Observer private JButton jrepos new JButton Repos private JButton jarme new JButton Enlever Arme private JButton jarmure new JButton Enlever Armure Controller this setLayout new GridLayout 0 2 Mauhly this addObserver this jrepos addActionListener new ActionListener public void actionPerformed ActionEvent e Mauhly this reposer jarme addActionListener new ActionListener public void actionPerformed ActionEvent e Mauhly this unsetArme jarmure addActionListener new ActionListener public void actionPerformed ActionEvent e Maubhly this unsetArmure this add jrepos 185 186 Le graphique this add jarme this add jarmur
92. 00 momo setForce 10 momo setNom affreux M En d finissant une m thode particuli re dans la classe Maulhy je peux cr er et initialiser mon objet de la mani re suivante public static void main String args Mauhly momo new Mauhly affreux 100 10 Pour que cela fonctionne la classe Maulhy doit d finir une nouvelle m thode appel e constructeur Il est facile de penser que le constructeur construit l objet En fait il n en est rien lors de l ex cution du constructeur l objet existe d j Le constructeur peut tre consid r comme une m thode d instance particuli re qui va fixer l tat initial de l objet Reprenons notre programme principal 50 D Les expressions d initialisa tion sont ex cut es avant l ex cu tion du constructeur Cela signifie 2 Os que lorsqu on ex cute le code du constructeur de Mauhly la va leur de exp est d j a0 a Un constructeur a deux caract ristiques essentielles Il porte exactement le m me nome que la classe aucune valeur de retour n est d clar e pie Lorsqu on ex cute le constructeur il faut bien se rendre compte que l objet est d j construit L ex cution du constructeur va juste permettre de fixer son tat initial Il est donc possible dans un construc teur d appeller des m thodes d instances la pile d appel Classes et objets class Mauhly private String nom
93. 2 2 jre lib rt jar Loaded java io Serializable from local langages Java solaris jdk1 2 2 jre lib rt jar Loaded java lang String from local langages Java solaris jdk1 2 2 jre lib rt jar Loaded Ljava security cert Certificate Loaded Hello hello world En fait l ex cution du programme hello world qui est le plus rudimentaire qui soit n cessite pas moins de cent soixante dix classes de la biblioth que Java Mais il n y a pas eu besoin de les compiler car elles l taient d j comme toutes celles de la biblioth que Elles ont en quelque sorte t utilis es en l tat Autrement dit il n est nul besoin du code source seul le code compil est n cessaire comme dans toute approche a base de compilation s par e C est galement le cas avec les biblioth ques C ou C par exemple Ce fait est tr s important dans le cadre d une approche industrielle de la distribu tion de logiciel En effet supposons que vous criviez une application Java destin e a tre commercialis e un moteur d animation 3D par exemple Vous pouvez alors vendre uniquement la biblioth que compil e implantant le moteur sans avoir r v ler vos secrets de fabrication en diffusant le code source correspondant Remarquez galement la machine Java a trouv o sont localis es les classes de la biblioth que le r pertoire de la biblioth que Java est
94. 2 Les interfaces Figure 6 5 Un visiteur concr t pour la classe Joueur public class CalculMasseTotaleVisitor extends JoueurVisitor private int masseTotale 0 public void visiter Joueur j masseTotale j getMasse public void visiter Arme a masseTotale a getMasse public void visiter Protection p masseTotale p getMasse public void visiter Potion p masseTotale p getMasse public void visiter Sac s masseTotale s getMasseAvide public int getMasseTotale return masseTotale L interface JoueurVisitable donn e sur la figure 6 6 est tr s simple elle ne sp cifie qu une seule m thode accept JoueurVisitor qu un visiteur doit appeler lors qu il veut visiter un objet C est le point principal de cet exemple La figure 6 7 donne le une vue partielle du code de la classe Joueur impl mentant l interface JoueurVisitable Nous avons dis qu il est de la responsabilit des objets visit s s assurer la navigation L im pl mentation de la m thode accept de Joueur assure dont la propagation de la visite en appelant la m thode accept des quipements li s au joueur lignes x y et z Il faut noter que nous avons ici un probl me au niveau du codage un objet de la classe Joueur r f rence les objets aux extr mit s des associations porte gr ce des variables d instances permet tant d acc der des objets implementant l interface Portab
95. 25 D placer le point de 10 unit s en abscisse et de 20 unit s en ordonn e pl d placer 10 20 Stocker les nouvelles coordonn es dans deux variables abs pl x ord pl y FIG 1 6 Un exemple de texte source avec des envois de messages finition de la classe o se retrouvent les trois parties de la figure 1 4 le nom de la classe les variables et les m thodes L op ration d instanciation consiste en quelque sorte mouler un objet d apr s la structure d finie par les variables Pour cette raison m me celles ci sont appel es variables d instance Les emplacements de la structure moul e sont ensuite remplies avec les valeurs ad quates ici les coordon n es du point La structure symbolisant l objet est pourvue d une tiquette rappelant le nom de la classe dont il est instance Une fois qu un objet est cr ses clients ne peuvent le manipuler qu l aide des m thodes de l interface C est l objet lui m me qui reste responsable de la ma ni re dont les actions correspondantes sont effectu es L invocation d une m thode est donc plut t une requ te un message envoy l objet par un client pour deman der l ex cution d une certaine op ration les objets et leurs clients communiquent par envois de messages Un message stipule le nom de la m thode correspondant l op ration effectuer les arguments effectifs ventuels de cette m thode et bien s r
96. 4 Exemples 135 Des monstres les Maulhy ont t pr c demment introduits cf 3 2 Comme indiqu dans le cahier des charges des tortuesjava cf 2 d autres formes de monstres existent les Handrey et les Mh ziny Du point de vue du jeu pour sa logique seule une classe partiellement abstraite Mons tre est n cessaire Il y sera pr cis les capacit s que doit pr senter un monstre pour que le moteur du jeu puisse la manipuler combattre setVie deplacer Par contre on peut imaginer plein de classes concr tes de monstre selon leur rendu gra phique les tactiques de combats et autres comportements Le jeu n a pas connaitre exac tement les classes concr tes Il peut se contenter de connaitre la classe g n rale des monstres et une autres classes g n rale ou interface abstraite permettant de fabriquer des monstres concr ts Nous pouvons donc introduire une classe abstraite Monstre et une interface Fabri queDeMonst re dans le package fr loria tortueJava moteur o les classes n cessaires la logique du jeu seront plac es Par contre les classes de monstres concr ts et la fabrique associ e seront group s dans un package part disons fr loria tortueJava On peut imaginer que d autres configurations de monstres puisse tre produites dans d autres packages et ins r es dans le jeu par des m canisme non d crits ici d l gation vers les fa briques Le sh ma UM
97. Avide masse int getMasse int resultat 0 for int i 0 i lt cptEquipement i resultat contient i getMasse return resultat Ce que demande Portable public Joueur getPorteur return this porteur public int getEmplacement return this emplacement public void porterMaintenant Joueur j int en this porteur j this emplacement en int getMasseAvide return masseAvide public void accept JoueurVisitor v for int i 0 i1 lt cptEquipement i contient i accept v v visiter this 126 Les interfaces Figure 6 10 Une classe Arme pouvant tre visit e par un JoueurVisitor public class Arme extends Equipement implements PortableEtJoueurVisitable private Joueur porteur private int emplacement Portable NON_ PORTE int coefDegat int getCoefDegat return coefDegat void setCoefDegat int coef this coefDegat coef public void accept JoueurVisitor v v visiter this Ce que demande Portable public Joueur getPorteur return this porteur public int getEmplacement return this emplacement public void porter Maintenant Joueur j int en this porteur j this emplacement en 6 7 1 Remarques concernant cet exemple 1 Dans la sp cification de l interface de JoueurVisitor nous avons utilis la sur chage param trique pour diff rencier les diff rentes m thodes visitant les diff rents concreteElements On retrouve en effet le
98. C est a dire les objets gra phiques doivent refl ter l tat des objets applicatifs tout moment 9 2 Construire un cran graphique le mod le compo site Nous avons d ja eu affaire au mod le composite avec nos tortues java Le sac d un monstre est un exemple de mod le composite Il s agit en fait d un patron de conception design pattern bien connu Le mod le composite permet de cr er des arbres en s appuyant sur 3 types de classes Les classes feuilles Les classes noeuds une classe abstraite permettant de manipuler indiff rement une feuille ou un noeud 9 2 Construire un cran graphique le mod le composite 153 9 2 1 Construction de l arbre Figure 9 1 Hi rarchie de classes principale Une classe abstraite Component f from awt pone nti es composants composites Button TextComponen from awt from awt TextField Container from awt from awt Window Panel Dist from awt from awt from awt REA Pas de nouvelles fen tres La figure 9 1 repr sente une partie du diagramme de classes de la librairie graphique java la classe abstraite La classe abstraite Component est la classe Composant du mod le composite Elle d finit le comportement et l tat d un objet gr
99. Care Le MRegion carte Carte x int y int Lane Carte nbrow int nbcol int egio Ke rs update o Observable arg Object void IgetRegion x int y int Region oetY int objet exter isplay JComponent BBsetMauhly mauh Mauhly void JLabel 1 BgetMauhiy Mauhly h rom swing JPanel objet externe Bdisplay JComponent from swing fegion IHM FN from Region from Carte E Bupdate o java util Observable arg Object void HMO pdate o jen rg Object Main Public void update java util Observable o Object arg i if mauhly null public IHM mauhy L nee this setLayout l a this seticon herbeicon new GridLayout regions length regions 1 length een for inti O icregions lengthii LE j this seticon mauhlyicon for int j 0 j lt regions i engthj this add Carte this getRegion i display SMauhiy is add Carte this getRegion i display ee jetRegion fa ouge Ekcombaitre IBgetVie EsetVie E eposer Le graphique Le code suivant constitue le programme principal de notre application minitortue Le canvas est trivial on cr e la carte on cr e les monstres sur la carte on demande la carte de se dessiner la carte en recevant ce message demande chacune de ses r gions de dessiner L cran de jeu est en place Chaque fois que l utilisateur appuie sur le bouton play les monstres se d placent et ventuelleme
100. Figure 7 5 Utilisation dynamique d une fabrique import fr loria tortueJava moteur Monstre import fr loria tortueJava moteur FabriqueDeMonstres import fr loria tortueJava config LeLoria class TestFabriquel public static void main String args FabriqueDeMonstres fab new LeLoria for int i 0 i lt 10 i System out println fab fabriquerUnMonstre 7 5 Stockage des package CLASSPATH et autres d tails On peut se demander quelle influence ont les packages sur le rangement des classes dans un syst me d exploitation Cette question n est en fait pas du ressort de la sp cification du langage chaque syst me de d veloppement java est libre d organiser physiquement les choses comme il l entend En fait une machine virtuelle java charge une classe en donnant un FQN un objet chargeur de de classe ClassLoader Une application peut m me d finir des chargeurs de classes sp cifiques pour r cup rer le code de certaines classes sur un serveur de base de donn e distant Mais dans le cas g n ral le stockage des classes outils du jdk sun entre autres les classes sont stock es dans 1 Des arborescences de r pertoires du syst me de fichiers du syst me d exploitation supportant la machine virtuelle Cette arborescence reproduit les imbriquations des noms de packages 2 Des fichiers compress s d archives avec une struture interne arborescente reproduisant aussi celles des noms
101. Il n y pas de confit de nommage public mylabelrvoidvoid Mauhly String nomp int forcep int viep nom nomp force forcep setVie viep Mss public int getVie return vie private void setVie int viep vie viep public void reposer set Vie getVie 10 FIG 3 25 Constructeur et m thode d instance Le nom d une m thode avec ses param tres typ s constitue sa signature Atten tion le type de retour d une m thode ne fait pas partie de la signature Deux m thodes ne peuvent avoir la m me signature dans la m me classe Dans l exemple figure 3 26 nous utilisons la surcharge param trique pour la d finition de plusieurs constructeurs et pour la m thode reposer La r solution de la surcharge param trique pour un appel donn se fait la com pilation Le compilateur selectionne parmi les diff rentes m thodes candidates celles qui ont le m me nombre de param tres puis choisit celle dont le type des param tres effectifs correspond au type des param tres formel Nous reviendrons plus tard sur les probl mes li s la surcharge param trique cf chapitre 4 Nous verrons dans le chapitre sur les conversions que la r solution de la surcharge param trique peut tre plus complexe que ce que nous pr sentons ici 54 Classes et objets class Mauhly private String nom public Mauhly String nomp int forcep private int force nom nomp private int vie force
102. JButton Arme m getArme p2 add jarmure new JButton Armure m getArmure panel pour visualiser le contenu du sac JPanel p3 new JPanel p3 setBackground Color green java awt List l new java awt List for Enumeration e m getEquip e hasMoreElements l add _ e nextElement ns p3 add aggr gation des diff rents panel f getContentPane add p1 f getContentPane add p2 f getContentPane add p3 Arbre pr t Affichage f pack f setVisible true 9 4 Applications graphiques et classes internes Le mod le par d l gation s implante mal en Java En fait le mod le on Event do Action est difficilement conciliable avec un approche objet En effet do Action est typiquement une op ration au sens classique et non une m thode d un classe Si on applique le mod le par d l gation tel quel en java on se retrouve confront la mise en place de classes artificielles juste pour h berger une m thode Action 9 4 Applications graphiques et classes internes 179 Figure 9 24 Mod le par d l gation et classes artificielles import java awt import java awt event class Quit implements ActionListener public void actionPerformed ActionEvent e System exit 0 class Main public static void main String args Frame f new Frame Button b f add b new Button quit b addActionListener new Quit
103. JList m getEquip 0 p3 add 1 aggr gation des diff rents panel f getContentPane add p1 BorderLayout WEST JPanel center new JPanel center setLayout new BorderLayout f getContentPane add center BorderLayout CENTER center add p2 BorderLayout NORTH center add p3 BorderLayout CENTER Arbre pr t Affichage f pack f setVisible true 9 3 G rer les v nements le mod le par d l gation Le mod le par d l gation est compos des l ments suivants Des objets v nements Par exemple KeyEvent WindowEvent ActionEvent Des objets producteur d v nements Par exemple un bouton peut produire l v nement ActionEvent 164 Le graphique Des objets consommateur d v nements Ces objets s abonnent aux v nements en provenance des producteurs une queue d v n ments et un processeur charg de propager les v n ments vers les consommateurs Le comportement g n ral du mod le par d l gations est assez simple les composants graphiques produisent des v nements les classes applicatives pour pouvoir tre consid r es comme consommateur d v nement doivent implanter les interfaces aq quates Par exemple si une classe est int r ss e par des v nements relatifs aux fen tres la classe applicative doit implanter WindowsListener Si elle int ress e par des v nements en provenance du c
104. L des classes et interfaces mises en jeux est donn sur la figure Du point de vue du patter abstract factory la table donne la correspondance entre participant du pattern et classes ou interfaces de l exemple La figure 7 3 donne le code de toutes les classes ou interfaces java mises en cause dans l exemple Du point de vue des packages et des contr les d acc s il faut noter que L interface FabriqueDeMonstres est d clar e comme public car en effet l id e est bien qu une fabrique concr te de monstre c est dire une classe impl mentant cette interface puisque tre localis e dans n importe quel package voulant fournir un ensemble de monstre Il en est de m me pour la classe abstraite Monstre qui est faite entre autre pour tre sous class e dans d autres packages Le package fr loria tortueJava configl est un exemple de tels packages il contient une classe publique LeLoria impl mentant FabriqueDeMonstre Cette classe poss de un constructeur publique accessible de l ext rieur des sous classes de Monstre uniquement accessible par les autres classes de ce package Du point de vue de l impl mentation de la fabrique concr te nous choisit la solution la plus simple avec juste un petit artifice le choix de la classe du monstre cr er est tir au hasard ligne 57de cf Fig 7 3 Un autre raffinement serait d assurer qu une seule instance de LeLoria ne soit cr
105. Table des mati res Table des mati res 1 La conception de logiciel 1 1 1 2 1 3 2 1 2 2 3 1 32 3 3 3 4 3 5 3 6 3 7 3 8 3 9 Le cycle de vie du logiciel Analyse et conception 1 2 1 Conception par traitements et conception par objets 1 2 2 Les notions de classe et d objet Ex cuter un programme 1 3 1 La machine virtuelle Java 1 3 2 Compilation et ex cution d un programme 1 3 3 La biblioth que Java Cahier des charges Tortues Java Les tortues java 2 1 1 Les l ments du jeu 2 1 2 Le jeu Analyse Classes et objets Objets et r f rences 3 1 1 L tat d un objet 3 1 2 Le comportement d un objet Les Classes Instanciation et appel de m thode Instanciation et constructeur Le mot clef this R f rences 3 6 1 R f rences et graphes d objets 3 6 2 Affectation de r f rences 3 6 3 Passage de r f rences en param tres 3 6 4 R f rence et copies d objets 3 6 5 Egalit des r f rences Encapsulation Mort des objets Ramasse miettes Constantes variables et m thodes de classes 3 10 Relations O n 3 11 Exemple recapitulatif An B amp B U O 13 14 16 21 22 22 23 25 27 28 28 30 32 39 49 54 54 54 56 57 62 63 66 69 70 72 76 VI Table des mati res 4 L h ritage 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 Exemple Syntaxe en Java Relation avec les l ments constituant une classe 4 3 1 H ritage et m thodes d instan
106. Un TextField de mani re g n rique envoie ses ChangeName param tre v nements une liste d actionListener ChangeName m Mauhly BactionPerformed e ActionEvent void 170 Figure 9 17 Diagramme de classe pour la gestion du bouton quit JComponent from swing AbstractButton from swing BaddActionListener l ActionListener void BBremoveActionListener l ActionListener void JButton rom swing detautCapable boolean tue BButton aramString MuButton icon Icon uButton text String MyButton a Action H2UButton text String icon kon updateUl void getUIClassID String BisDefauttButton boolean isDefautCapable boolean setDefaultCapable defautCapable boolean void removeNotify void amp configurePropertiesFromAction a Action void EXwriteObject s ObjectOutputStream void String getAccessibleContext Accessible Context listenerl EveniListenerList from event S 0 n EventListener from util ActionListener from event ActionEvent from event BSactionP erformed e ActionEvent void Quit Figure 9 18 Diagramme d objets pour I application actionP erformed e ActionEvent void
107. Vie s ex cute elle s ex cute sur un objet this est une r f rence sur l objet receveur du message Nous reviendrons plus tard sur l utilisation de cette r f rence Il est possible d inspecter la pile d appel en parcourant les diff rents blocks de la pile d appel et ainsi d afficher les contexte d ex cution de chaque m thode main 1 up main 2 where 2 Mauhly reposer Mauhly 19 3 Main main Main 5 main 2 locals Method arguments Local variables this Mauhly 3dc15b79 main 2 up main 3 where 3 Main main Main 5 main 3 locals Method arguments Local variables 3 3 Instanciation et appel de m thode 45 args momo main 3 Mauhly 3dc15b79 Dans le contexte d ex cution j ai acc s a la r f rence momo je peux demander d afficher la valeur de l objet r f renc main 3 where 3 Main main Main 5 main 3 locals Method arguments Local variables args momo Mauhly 3dc15b79 main 3 dump momo momo Mauhly Oxel private int exp private int vie 0 0 private int force 0 private java lang String nom null main 3 On peut tout a fait v rifier que je n ai pas racont de conneries jusqu a mainte nant Je demande maintenant la machine de terminer l ex cution je remonte en haut de la pile et je lui demande de continuer main 3 dump momo momo Mauhly Oxel private int exp 0 private int vie 0 priva
108. _ramass M a class Main public static void main String args Mauhly m1 new Mauhly affreux 15 25 ml setArme new Arme 5 mi setArmure new Armure 6 while true Mauhly m2 new Mauhly pa_bo 18 30 m2 setArme new Arme 10 m2 setArmure new Armure 10 FIG 3 55 Activer le ramasse miettes class Hero private String nom Hero private int force private int vie private int exp 10 private static Hero hero null private Hero Random r new Random force r nextInt 10 vie r nextInt 10 public static Hero getInstance if hero null hero new Hero return hero public void combattre Mauhly ennemi ennemi setVie ennemi get Vie this force public int getVie return vie private void setVie int viep vie viep public void reposer setVie get Vie 10 class Main public static void main String args Hero getInstance reposer Hero h Hero getInstance h reposer H FIG 3 56 Variables et m thodes le singleton 72 Classes et objets Caig est_compos e_de Region BR it Care nbrow int nbcol int 1 BBy int MgetRegion x int y int Region Region carte Carte x int y int WgetCarte Carte BgetX int IgetY int BsetMauhiy mauhly Mauhly void MgetMauhly Mauhly Mauhly Borce int
109. agramme de classe UML est donn sur la figure Les interfaces I1 et I2 introduisent toutes deux des constantes A et B avec des expressions d initialisations diff rentes lignes 2 3 6 et 7 Ces d clarations d finissent quatres constantes diff rentes que la classe C h rite puisse qu elle indique implementer les interfaces I1 et I2 ligne 9 La notation B ligne 12 n est pas ambigue elle correspond la d claration de la ligne 10 qui masque celles h rit es de I1 et I2 Par contre la notation A de la ligne 14 est ambigue le compilateur ne peut pas deviner si le programmeur d sire faire r f rence la d claration h rit e de I1 ou celle h ri t e de 12 L usage du nom de l interface dans la r f rence lignes 15 et 16 permet d viter un tel conflit La figure 6 3 donne l erreur g n r e par le compilateur dans une tel situation 118 Les interfaces Figure 6 3 Interfaces h ritage mutiples et ambiguit interface Il int A 1 String B trois interface I2 int A 2 String B deux class C implements I1 I2 static double B 3 0 public static void main String args System out println B System out print A System out println 11 A System out println 12 A 6 5 3 Interfaces et surcharge Une classe h rite de toutes les d clarations de m thodes d instances faites dans les interfaces qu elle ou ses super classes pr tend impl menter Si plusieurs d clarations de
110. aphique abstrait De mani re g n rale L tat d un objet graphique abstrait est d finit par une position x y et une taille Le comportement essentiel d un objet graphique est sa capacit a tre dessin travers sa m thode paint Les feuilles Les feuilles du mod le composite savoir les classes Button List Text field sont des objets graphiques primitifs pr t l emploi Ils red finissent la m thode paint en fonction de ce qu ils sont et emettent les v nements en ad quation avec leurs r les Un Button r d finit la m thode paint pour dessiner un bouton et peut mettre les v nements Bouton enfonc ou bouton relach les noeuds Les noeuds servent composer les composants La classe Containter est une classe abtraite permettant simplement d aggr ger des composants Maintenabnt ces r pertoires de composants peuvent s afficher dans des fen tres part auquel cas le noeud en question sera de type Window ou au sein d une fen tre existante auquel cas le noeuds sera de type Panel Nous appliquons ce principe pour repr senter l tat de notre heros de tortues java Il s agit de visualiser le nom la vie la force du heros l arme et l armure port e et enfin le contenu du sac La figure repr sente les objets visualiser Nous appelerons ces objets le mod le La figure 9 3 repr sente notre cran de visualisation Il s gir d n assemblage d objets graph
111. ar l interface de l objet ennemi Comme ennemi est de la m me classe que this nous aurions pu acc der directement les variables d instance de ennemi Mais bien sur dans ce cas nous aurions mal appliqu le principe d encapsulation 4 L h ritage 82 L h ritage Nous avons vu que pour cr er un objet il faut d finir sa classe Cette classe peut d ailleurs servir cr er plusieurs objets plusieurs instances Diff rents constructeurs et leurs para m tres permettent m me de faire varier les objets cr s Mais comment cr e t on des classes sans trop se compliquer la vie La solution classique est de construire un classe partir d une autre en lui ajoutant ou en modifiant des m thodes et attributs C est le m canisme d h ritage Notons tout de suite qu en Java l h ritage est simple une classe se d finit explicitement partir d au plus une classe Ainsi les classes forment des arbres d h ritage 4 1 Exemple Voyons tout de suite ceci sur un exemple Introduisons une nouvelle classe pour notre jeu La classe Equipement un objet qui peut tre mis dans le sac Un quipement pos s de une masse pour supporter de futures r gles limitation de la masse totale du sac Il poss de aussi un prix pour faire l inventaire en fin de partie et supporter une exten tion possible des r gles sur le calcul du score A partir de cette classe trois nouvelles classes peuvent tre d finies Pr
112. ariables d finies dans l interface utilis e la d cla ration de la r f rence sont accessibles via celle ci Il est parfaitement correct de cr er des tableaux de r f rences une interface La syntaxe est la m me de que celle vue pr c demment cf lt nom d interface gt t new lt nom d interface gt lt nombre d l ment s Cette op ration de construction de tableau m me si une interface est une classe abs traite a bien un sens puisque seule des r f rences sont cr es aucune instance d objet n est effectivement cr e sauf le tableau lui m me 6 4 Notation en UML et exemple simple 115 L acc s aux constantes d finies dans une interface peut aussi se faire par la notation lt Nom d interface gt lt Nom de constante gt C est la m me notation que l acc s aux constantes d une classe cf 6 4 Notation en UML et exemple simple Nous avons pour l instant d fini une petite hi rarchie d equipements pouvent tre mis dans un sac Certains de ces quipements peuvent aussi tre port s par le joueur ils doivent en fait tre obligatoirement tre port s avant d tre utilisables c est le cas pour l instant des protections et des armes voir du sac Par contre nous d cidons que les les potions n ont pas tre port es elles sont simplement consomm es une seule fois Ainsi le joueur n aura pas reposer son arme ou bouclier avant de pouvoir consommer une
113. attaque et il y a donc combat cf le cahier des charges Ce faisant nous venons 3 1 Objets et r f rences 31 de mettre en vidence une autre m thode combattre n cessaire pour mod liser cette partie du comportement du h ros Elle doit prendre en param tre le monstre combattre puisqu il faut tre deux pour se battre Un examen d taill du cahier des charges permet ainsi de d terminer progressive ment les diff rentes m thodes n cessaires Passons plus rapidement sur les restantes e Le h ros peut se suicider mettant ainsi fin au jeu m thode suicide e Le h ros peut franchir la porte menant la carte suivante condition de r sider sur la case contenant la porte m thode franchirPorte Le h ros peut ramasser un des objets se trouvant sur la case o il r side m thode prendre equipement Le h ros peut changer d arme m thode changerArme arme ou d ar mure m thode changerArmure armure La figure suivante montre une repr sentation compl te de l objet heros hero nom momo54 Point de Vie 100 Exp rience 41 Force 18 Ame Porte armure Port e Sa franchirPorte Porte Prendre Equipement boire potion changerArme Arme changerArmure Armure muni des m thodes appartenant l interface de l objet Toujours selon le principe d encapsulation un utilisateur de l objet ne peut manipuler c est dire modifier son
114. blioth ques standards de java utilisent de nombreuses interfaces Sinon les inter faces listener de l AWT Advance Window Toolkit Ces listeners sp cifient les actions que 6 6 Exemple dans la biblioth que standard java 119 lt lt ntertace gt gt lt lt ntertace gt gt 2 FIG 6 2 Diagramme de classe et interfaces pouvant g n rer des ambiguit s C java 4 Reference to A is ambiguous It is defined in interface I2 and interface Il System out print A A 1 error FIG 6 3 Erreur de compilation en cas d ambiguit sur des variables l on peut faire en r ponse des venements li s au divers objets d une interface graphique une fen tre est ferm e un bouton est actionn Une interface vide java util EventListener enracine l ensemble des inter faces listeners Citons java awt WindowListener qui sp cifie 7 m thodes On y trouve la m thode windowClosing qui est appel e lorsque que l utilisateur veut fermer la fen tre via une interaction sur l interface graphique Un programmeur d sirant faire ex cuter une action pr cise lorsque qu un objet de la 120 Les interfaces Participant du pattern classe java de l exemple Visitor JoueurVisitor Concrete Visitor CalculMasseTotaleVisitor Element JoueurVisitorEnable ConcreteElement Joueur Arme Protection Potion Sac ObjectStructure Joueur TAB 6 1 Correspondance entre les composants du pattern Vis
115. c est un discours classique chez les tudiants on fait un programme qui marche on traitera les erreurs apr s alors que les dites erreurs ont pour effet de rendre tr s difficile la mise au point du programme qui marche Java pr sente donc l inter t de couper court toutes questions sur le sujet Permettre au programmeur de s parer de mani re flexible le code du cas correct ex cut dans 90 des cas du traitement des erreurs En effet un code C sous Unix est truff de if 1 pour filtrer les retours d appels syst mes en erreur cela nuit la lisibilt du code on a parfois du mal saisir ce que fait un extrait de code il faut en effet recoller plein de morceaux de code dilu s dans des expressions condi tionnelles Le tutorial java avance un taux d augmentation du code de 400 d s que l on ajoute le traitement des erreurs cas d un code faisant des entr es sorties dans un fichier Un tel m canisme est courant il existe dans d autres langages C et Eiffel entres autres L id e existe aussi en quelque sorte dans les syst mes d exploitation trap li un co processeur arithm tique certaines interruptions sous Unix Dans Visual Basic l instruction on error goto permet de traiter les erreurs venant du syst me et des biblioth ques pr d fi nies Les programmeurs C sous Unix exp riment s utilisent set longjump et Long jump pour mettre en place des m canis
116. ce 4 3 2 M thodes de classe 4 3 3 H ritage et attributs 4 3 4 H ritage et constructeurs 4 3 5 Remarques diverses Classes et m thodes abstraites 4 4 1 M thodes abstraites 4 4 2 Classes abstraites et probl me d instanciation Classes m thodes et attributs finaux 4 5 1 Classes finales 4 5 2 M thodes finales 45 3 Attributs finaux De l influence de protected public et autres contr le d acc s 4 6 1 Influence du mot clef private 4 6 2 Influence du mot clef protected La classe Object Questions 4 8 1 Petits exercices 5 La liaison dynamique 5 1 5 2 5 3 5 4 M canismes mis en uvre 5 1 1 Actions la compilation 5 1 2 Liaison l ex cution Quelques exemples d erreurs li es aux m canismes d invocation 5 2 1 Utilisation des types statiques lors de la s lection des signatures 5 2 2 Informations g n r es la compilation et modification ult rieurs des classes Liaison dynamique et constructeurs Conclusions 6 Les interfaces 6 1 6 2 6 3 6 4 6 5 6 6 6 7 D finition Implementation d une interface R f rences d interface Notation en UML et exemple simple Interface h ritage ambigu t 6 5 1 H ritage mutiple des interfaces 6 5 2 Interfaces et masquage ambigu t 6 5 3 Interfaces et surcharge 6 5 4 H ritage multiple d une m me interface Exemple dans la biblioth que standard java Interfaces et pattern visitor 6 7 1 Remarques concernant cet exemple
117. ce de la classe C n appelle invoquation pas forc ment la m thode de C l ex cution mais plut t une m thode plus proche du type dynamique de l objet r f rence une sous classe de C Ce m canisme est la base du polymorphisme et de nombreux design patterns Sa mise en ceuvre peut avoir des effets inattendus Nous allons pr ciser dans ce chapitre quels points essentiels pour viter certaines erreurs 5 1 M canismes mis en uvre Nous allons uniquement consid rer le cas de l invocation d une m thode d instance non d clar e comme private pouvant donc tre soumise une surcharge param trique et une surcharge par h ritage Cette pr sentation est une adaptation de 15 11 pages 323 343 Trois formes d invocation peuvent se pr senter 1 lt nom de m thode gt lt expressionl gt lt expressions2 gt Cette forme doit tre contenue dans du code relation une instance m thode expression d initialisation d une variable d instance bloc non statique d initialisation 2 lt expression gt lt nom de m thode gt lt expressionl gt lt expressions2 gt Expression doit retourner une r f rence vers une classe ou une interface 3 super lt expressionl gt lt expressions2 gt Une telle forme ne peut pas tre utilis e dans la classe Object cf 4 7 et l utilisation de this doit tre valide dans le m me contexte 5 1 1 Actions la compilation
118. dans l espace qui lui est propre avec quelle taille Les algorithmes de placement sont l pour organiser les placements des objets graphiques d un conteneur Avoir des algorithmes de placement est plus interessant que de placer soit m me les objets dans l espace graphique du conteneur parce qu ainsi les redimensionnement de fen tres ou les changement l apparation de nouveaux composants dans le conteneur vont provoquer nouveau l activation de l algorithme de placement Les algorithmes de placement d coupe l espace graphique d un conteneur en zones o ils placent les objets contenus dans le conteneurs Si un conteneur contient 5 boutons et les place suivant un BorderLayout le r sultat est celui de la figure 9 6 Figure 9 6 Les algorithmes de placements BorderLayout center applet started Si conteneur contient 6 boutons et utilise un algorithme de placement de type Grid Layout le r sultat est celui de la figure 9 7 9 2 Construire un cran graphique le mod le composite 159 Figure 9 7 Les algorithmes de placements GridLayout LLL PEE Figure 9 8 Les algorithmes de placements Component from awt component Button Container from awt from awt layoutM gr lt lt interface gt gt LayoutManager from awt lt lt Interface gt gt LayoutM ana ger2 from awt
119. de la figure 6 2 Il faut aussi que la classe Joueur soient modifi e afin d implanter les relations porteEnMainDroite porteEnMainGauche et porteSurLeDos voir le code de la figure 116 Les interfaces lt lt nterface gt gt Portable amp NON_PCRTE int 0 amp MAIN_DROMTE int 1 0 1 g MAIN_GAUCHE int 2 o DOS int 3 0 1 getPorteur Equipement poteEnMainGauche VgetE mplacement masse int poteSurDos m Sport eM aintenant valeur int 0 1 7 A LA uetMasse f f porteE nMginDroie setMassel get aleur port ur wa si set aleur 0 1 porteur ee 0 1 her Joueur 0 1 porteur Arme Protection BporteeEn int Portable NON_PORTE BscoefProtection int BcoefDegat int eee ee ae porteur Joueur SuetCoefProtection setCoefProtection oetCoefDegat setCoefDegat SgetPorteur SgetEmplacement SporterM aintenant FIG 6 1 L interface Portable en UML Figure 6 2 Une implementation de l interface Portable public class Arme extends Equipement implements Portable Joueur porteur int emplacement Portable NON_PORTE int coefDegat int getCoefDegat return coefDegat void setCoefDegat int coef this coefDegat coef Ce que demande Portable public Joueur getPorteur return this porteur public int getEmplacement return this emplacement
120. de packages Ce sont les fichiers d archives Java Java ARchives files ou jar file Ce format simplifie la distribution des packages 4 travers un r seau sur des CR Ils peuvent de plus contenir des informations sur les versions des packages des signatures lectriques pour tre s r que de l organisation ou entreprise qui pr tant avoir d veloppement les classes Dans le cas du jdk sun l emplacement les packages de base de java java lang java UTIL sont connus directement par les outils javac java 140 Les packages Par contre si vous installez d autres packages ou que vous en d veloppez il faut indiquer la liste des chemins d acc s aux r pertoires contenant les racines des arborescences de fi chiers supportant les packages dans la variable d environnement CLASSPATH En g n ral si la variable CLASSPATH est utilis e il faut y placer le chemin sur le r pertoire courant en effet c est l que sont plac es les classes du package non nom Pour les packages contenus dans des jarfiles il faut placer le nom complet avec chemin d acc s du fichier d archive La syntaxe exacte des chemins d acc s et les s parateurs utilis s ou d pendent du syst me d exploitation support Les outils du jdk acceptent aussi une option en ligne classpath pour indiquer une liste de chemins similaire celle contenue dans la variable CLASSPATH Si cette option est utilis e le contenu de la variable CLASSPATH
121. des classes dans un m me package ouvre des possiblit s de liens tr s forts fort couplage entre elles Par contre du point de 7 4 Exemples 133 vue des classes situ es dans d autre package ce sont les l ments marqu s comme public qui constituent des points d acc s dans le package 7 4 Exemples 74 1 Une classe utilitaire Nous allons cr er une classe d int ret g n ral un tableau d objets qui s aggrandit auto matiquement contrairement aux tableaux java qui ont une une taille fix e leur cr ation Cette classe peut servir l implementation d un certain nombre d autres Nous allons la placer dans un package de classes utilitaires fr loria tortueJava util Le code de cette classe est donn sur la figure 7 1 La ligne importante est donc la clause package fr loria tortueJava util Il faut aussi noter que nous avons d clar cette classe comme publiques ainsi que tous les constructeurs et les m thodes comme publiques car en effet sans indication particuli re ces appels ne seraient accessibles qu a partir des classes de ce package fr loria tortueJava util ce qui est bien trop restrictif pour une classe utilitaire Une telle doit pouvoir tre instanci e ou d riv e partir d une classe situ e dans n importe quel package De m me toute instance de cette classe doit pouvoir tre cr e modifi e acc d e partir de n importe quel package Un exemple d utilisation de cette clas
122. ditionn part dans une classe interne Cette construction en utilisant les classes internes n est pas obligatoire 184 Figure 9 28 Mod le Vue Controleur Controller from Mauhly View from Mauhly PaintView from Mauhly Equipement equip 0 lt lt interface gt gt Observer from util Rupdate o Observable arg Object void Lu Barme Observable from util BoObservable BaddObserver o Observer void MdeleteObserver o Observer void BhotityObservers void BnotifyObservers arg Object void MdeleteObservers void BsetChanged void MclearChanged void BhasChanged boolean BcountObservers int Armure armure Vector Mauhly Figure 9 29 Mod le Vue Controleur e3 Armure e2 Armure Vector Le mod le arme Ame armure Armure Mauhly Instanciation de la relation 0 n Observable Observer Le Constroleur N ci Controller vi PaintView v2 View import javax swing import java awt event import java util import java awt Les vues Le controleur est ici aussi
123. e public void update Observable 0 Object arg jarme setEnabled Mauhly this arme null jarmure setEnabled Mauhly this armure null class View extends JPanel implements Observer JPanel pl new JPanel JPanel p2 new JPanel JPanel p3 new JPanel JLabel jname new JLabel Nom Mauhly this nom JLabel jvie new JLabel Vie Mauhly this vie JLabel jforce new JLabel Force Mauhly this force JLabel jarme new JLabel Arme Mauhly this arme JLabel jarmure new JLabel Armure Mauhly this armure JList jsac new JList Mauhly this equip View Mauhly this addObserver this this setLayout new BorderLayout pl setBackground Color cyan pl setLayout new GridLayout 0 1 pl add jname pl add jvie pl add jforce Panel pour les armes et armure p2 setBackground Color yellow p2 add jarme p2 add jarmure panel pour visualiser le contenu du sac p3 add jsac this add p1 BorderLayout WEST this add p2 BorderLayout NORTH this add p3 BorderLayout CENTER this add new Mauhly Controller BorderLayout SOUTH public void update Observable 0 Object arg jname setText Nom Mauhly this nom jvie setText Vie Mauhly this vie jforce setText Force Mauhly this force jarme setText Arme Mauhly this arme jarmure setText Armure Mauhly this armure jsac setListData Mauhly this equip 9 5 Principe du
124. e peut d clarer une valeur initiale A la cr ation des objets si cette a ous valeur n est pas modifi e par d autres m canisme exp de l ob jet cr vaudra 0 Chaque m thode d instance est aussi soumise au contr le d acc s public signifie que n importe qui i e n importe quel objet peut appeler cette m thode Classes et objets class Mauhly private String nom private int force private int vie private int exp 0 public int getForce return force Due public int getExp return exp Public int getVie return vie private void setVie int viep vie viep public void reposer setVie getVie 10 Il lt gt class Mauhly FIG 3 4 la classe Maulhy types et contr le d acc s Par convention et pour am liorer la lecture on se borne a une instruction ter min e par un par ligne Tl est possible de d clarer les m thodes puis les variables d instances ou m me de mixer les deux par convention on d clare d abord tout ce qui est relatif a l tat puis ce qui est relatif au comportement Les contr leurs d acc s comme public ou private s appliquent aux va riables et aux m thodes d instances Ils sont le m canisme permettant de mettre en place le principe d encapsulation dans le langage java Si nous voulons nous conformer au principe d encpasulation il faut d finir les variables
125. e 9 33 Diagramme de classes de l application sactree Equipement public void addEquip Equipement e isLeaf boolean den ci equip addElement e Rouet Sac void this getSacRoot reload etParent Sac getSacRoot SacRoot BBtoString String On 0 1 lt lt interface gt gt I parent TreeModel Sas from tree Armure Ame sac peie li ame IaddEquip e Equipement void a armure IgetEquip Vector BisLeaf isLeaf boolean RS Observable etindexOfChild from uti Eu add TreeModell istener SacRoot a removeTreeModelListener Sat Breload void rf 0 n oun eee i lt lt interface gt gt from util TreeModelListener from event i reeModellistener Controller PaintView View x from Mauhly from Mauhly from Mauhly itr Te from swing public void reload TreeModelEvent event new TreeModelEvent this newTreePath this for Enumeration e v elements e hasMoreElements TreeModelListener TreeModelListener e nextElement LtreeStructureChanged event Le programme suivant montre le code de la classe SacTree Cette classe repr sente l implantation de l interface TreeModel Cette classe
126. e a public abstract void visiter Protection p public abstract void visiter Potion p public abstract void visiter Sac s La figure montre le code d une implementation par d rivation de JoueurVisitor Comme d j dit elle calcule la masse totale d un joueur et des quipements qu il transporte Pour cela elle d finit une variable d instance d accumulation ligne 2 qui est mise jour chaque fois qu un objet accepte d tre visit en appelant la m thode correspondant a sa classe concr te lignes 4 7 10 13 et 16 En g n rale la mise jour ce fait en appellant la m thode getMasse cf 4 2 que nous avons d ailleurs ajout e la classe Joueur Nous consid rons que la navigation parcour des relations porteEnMainDroite porteEnMainGauche porteSurDos ou travers e d un conteneur comme le tableau de Sac est de la responsa bilit des l ments eux m me Le cas de la visite de la classe Sac pose un probl me nous y avons en effet d ja d fini une m thode getMasse qui prend en compte les quipements contenus dans le sac cf 4 4 1 Le visiteur passant individuellement sur chaque objet de la structure nous comptabiliserions deux fois les quipements contenus dans un sac si la m thode getMasse tait utilis e lors de la visite d un sac Nous consid rons donc qu un sac poss de une masse propre sa masse vide retourn e par la m thode getMasseAvide ligne 16 12
127. e de visualisation de l tat du h ros L cran de visualisation a quelque peut chang La figure 9 15 repr sente notre nouvel cran Un bouton Quit a t ajout pour permettre de quitter l application Le label pour visualiser le nom du joueur a t remplac par un textfield permettant de changer le nom du joueur Figure 9 15 Ecran de visualisation La figure 9 16 montre comment nous g rons le changement de nom du joueur La fi gure 9 18 montre comment nous g rons le bouton Quit Figure 9 16 Diagramme de classe pour la gestion du nom Chaque v nement a une EventListenerList a source ici texfield Il est from event EventObject toujours possible de connaitre een l origine Badd t Class EventListener void 5 Sremove t Class EventListener void non ro Object istenerList MoSrirgo Sting JComponent Bin irom swing i pl EventListener from util JTextComponent Aoo from text from event odifiers int niia a ActionListener BparamString String from swing from event BhorizontalAlignment int LEADING icolumns int BactionPerformed e ActionEvent void columnWidth int addActionListener ActionListener void removeActionListener ActionListener void Code aex cuter dans actionP ermomed ActionEvent en
128. e gt pour pouvoir utiliser dans l unit de compilation la classe unique d sign e par la clause juste par son nom sans le nom du package 7 2 Cr ation utilisation noms 131 2 import lt nom de package gt x pour pouvoir utiliser dans l unit de compilation toutes les classes du package d sign directement par leur nom simple sans pr fixe le nom du package Attention cette clause ne donnent pas acc s aux classes des sous packages De plus cette clause ne recherche une classe dans un package que lorsque qu un nom simple est utilis pour la premi re fois dans l unit de compilit tion type la demande 7 2 1 Package par d faut Jusqu pr sent nous n avons pas utilis de clause package on peut se demander alors comment nos classes sont utilis es et nomm es Elles sont en fait plac es dans un package non nomm Il peut m me selon le syst me de compilation employ avoir plusieurs pa ckages non nomm s En tout tat de cause il est fortement d conseill de D utiliser les classes ou interfaces d un package non nomm partir d un package nomm Il est fortement conseill De conditionner une application dans une hi rarchie de packages De n utiliser la facilit de package non nomm que pour des programmes de test Pour des packages largement distribuables nous avons vu qu il faut utiliser le nom de domaine comme prefixe ce qui rend finalement c
129. e la classe Equipement Ceci est parfaitement possible et s crit 4 3 2 M thodes de classe Le rapport des m thodes de classes statiques avec h ritage est tr s diff rent du cas des m thodes d instance puisqu il n y a pas d instances consid rer Si une sous classe disons B d finit une m thode de classe disons m avec les m me nom et profil qu une autre m thode de classe de l une de ses super classe disons A on dit que la m thode d finie dans B masque celle d finie dans A Le terme anglais utilis dans les documentations Java pour le masquage est hiding Il faut noter qu en Java c est une erreur la compilation de vouloir masquer par une m thode statique une m thode d instance La r ciproque est aussi une erreur la compilation il est interdit de vouloir surcharger une m thode de classe par une m thode d instance Quel effet a ce masquage Et bien dans le code de B code d initialisation de variable ou bloc statique m thode d instance ou de classe l appel m sera toujours celui de la m thode d finie dans B Sans artifice particulier l acc s la m thode d finie dans la super classe reste impossible la m thode m de A est bien masqu e par celle de B B n h rite pas de la m thode d finie dans A Il est possible d acc der une m thode masqu e par la notation lt nom de classe gt lt nom de m thode gt Cette notation permet
130. e un type abstrait et les constantes s y rapportant Il n est pas n cessaire de pr ciser public final static devant les d clarations de variables d une interface ni public abstract devant les d clarations de m thodes d une interface Il est m me recommand de ne pas utiliser ces mots clefs qui sont en fait redondants vu la d finition d une interface 6 2 Implementation d une interface En tant que telle une interface a un inter t tr s limit elle ne permet pas en elle m me de cr er des instances Pour cela il faut qu au moins une classe implemente cette interface c est dire fournisse les m me m thodes mais avec un corps Le mot clef implements permet de relier une d finition de classe une ou plusieurs interface Une interface se compile comme une classe Il est conseill de cr er un fichier java unit de compilation du nom de l interface Comme pour les classes l usage demande que leurs noms commencent par une majuscule 6 3 R f rences d interface Une r f rence d objet peut tre d clar e en utilisant le nom d une interface en lieu et place du nom d une classe Une telle r f rence permet de r f rence sans transtypage cast n importe quelle instance d une classe qui impl mente l interface en question Le contr le de type la compilation de Java utilise les liens d implementation d clar s entre classes et interfaces Bien entendu seules les m thodes et v
131. e vision du cycle de compilation et ex cution est assez sim pliste En particulier le programme que nous venons d ex cuter a crit hello world 1 3 Ex cuter un programme 17 sur la sortie standard de l interpr te de commandes de la station de travail Or pour r aliser une entr e sortie il faut disposer des objets permettant de repr senter les m canismes d entr e sortie donc des classes d crivant ces objets Ces classes et quelques autres sont regroup es dans la biblioth que Java et elles ont t charg es par la machine virtuelle en m me temps que la classe de l applica tion Hello Le lancement du programme en mode verbeux option verbose permet de s en rendre compte ais ment car il provoque l affichage des noms de toutes les classes charg es pour l ex cution Fig 1 2 Figure 1 2 Les classes charg es lors de l ex cution du programme hello world java verbose Hello Opened local langages Java solaris jdk1 2 2 jre lib rt jar in 40 ms Opened local langages Java solaris jdk1 2 2 jre lib i18n jar in 4 ms Loaded java lang NoClassDefFoundError from local langages Java solaris jdk1 2 2 jre lib rt jar Loaded java lang Class from local langages Java solaris jdk1 2 2 jre lib rt jar Loaded java lang Object from local langages Java solaris jdk1 2 2 jre lib rt jar Loaded java lang Throwable from local langages Java solaris jdk1
132. e visiter Equipement Nous pouvons v rifier ceci en d compilant le code g n r pour la classe Arme en utilisant la commande javap du jdk Nous utilisons les options p pour ne consid rer que les m thodes publiques et c pour avoir un aper u du p code g n r Le r sultat de l appel javap public c Arme est donn sur la figure 5 3 On constate bien sur la ligne 17 de ce listing que l invocation de visiter est bien celle d une m thode d instance invokevirtual et que la signature attendue poss de un param tre de type Equipement Figure 5 2 class Visiteur public void visiter Equipement e System out println visiter Equipement class Equipement public void accept Visiteur v System out printin Equipement accept v visiter this class Arme extends Equipement public void accept Visiteur v System out printin Arme accept v visiter this class Test public static void main String args Visiteur v new Visiteur Equipement a new Arme a accept v Modifions la classe Visiteur comme indiqu e sur la figure 5 3 en surchargeant sur charge param trique la m thode visiter par une deuxi me m thode visiter prendre une Arme en param tre Si nous recompilons juste la classe Visiteur javac Visiteur java 5 2 Quelques exemples d erreurs li es aux m canismes d invocation 109 Compiled from Arme java class Arme extends Equipement public
133. eller d autre m thodes et ainsi de suite jusqu atteindre la derni re ligne de la m thode main Par exemple lors de l ex cution de la m thode set Vie appel e par la m thode m thode d instance reposer elle m me appel e par la m thode de classe main il y a donc trois m thodes empil es reposer attend la fin de l ex cution de setVie et main attend la fin de l ex cution de reposer La figure 3 11 repr sente l tat de la pile d appel lorsque le pointeur d ex cution est sur la ligne 19 cf3 8 Chaque m thode poss de un contexte d ex cution form de ses param tres ef fectifs et de ses variables locales La figure repr sente la pile d appel avec les variables locales et la param tres effectifs Cette pile d appel peut tre visualis e en utilisant le d bogueur java jdb Pour l utiliser il faut p alablement compiler les fichiers java avec l option de compilation g o bar instanc 67 cd ex1 bar ex1 68 ls Mauhly java Main java bar ex1 69 javac g java On peut ensuite lancer la machine virtuelle Java en mode debug en appelant jdb bar ex1 70 jdb Main Initializing jdb 3 3 Instanciation et appel de m thode 43 Oxb0 class Main gt Pour visualiser la pile d appel a l entr e de la m thode set Vie je dois demander la machine virtuelle de s arr ter quand elle commmence ex cuter cette m thode bar exl 70 jdb Ma
134. endre ici qu affecter m2 m1 ne recopie l tat de l objet m2 dans m1 seule la r f rence m1 qui r f ren ait l objet m1 r f rence desormais l objet r f renc par m2 L incompr hension de affection des r r rences est source d erreur bien connue chez les d butants 3 6 3 Passage de r f rences en param tres Cette particularit d affection des r f rences se retrouve de la m me mani re lors du passage des param tres Dans la figure 3 37 la m thode combattre prend 58 Classes et objets a player Main m Mauhly a Arme b Armure main auhiy affreux 15 25 Arme 5 Armure 6 setArme a setArmure b FIG 3 31 Diagramme de s quence 1 main 2 Mauhly affreux 15 25 player NN 5 setArme a 6 setA mure b gt m Main O Mauhly NN 3 Arme 5 4 Armure 6 N a Arme b Amure FIG 3 32 Diagramme de collaboration la pile d appel le tas d objets m Maulhy nom affreux Point de Vie 100 Exp rience 0 Force 10 IDC FIG 3 33 Etat de la machine vituelle avant la fin de main 3 6 R f rences class Main public static void main String args Mauhly ml new Mauhly affreux 15 25 Mauhly m2 new Mauhly pas bo 10
135. ent p3 add 1 aggr gation des diff rents panel f getContentPane add p1 f getContentPane add p2 f getContentPane add p3 Quitter JButton jquit new JButton Quit jquit addActionListener new Quit f getContentPane add jquit Arbre pr t Affichage f pack f setVisible true 9 3 2 Gestion des menus La gestion des menus reste tout fait dans l esprit du mod le par composition pour la construction des menus et du mod le par d l gation pour la gestion des v nements La figure 9 21 l cran de visualisation de l tat du h ros avec des menus Figure 9 21 Diagramme simplifi d activation amas amet Pour construire les menus nous avons construits un arbre de composant avec des nou veaux composants graphiques JMenuBar JMenu JMenultem La figure montre arbre graphique de cette application 174 Le graphique Figure 9 22 Diagramme d objet d un cran graphique avec menus T JFrame ee f setUMenuBar jmb J F A jmb JMenuBar jmb add help pi p2 p3 7 JPanel JPanel JPanel x a file help JMenu JMenu_ help add About ES Quit About JMenultem JMenultem _ addActionList ener quit Quit Le code ci dessous montre le
136. eption de gros logiciels notamment parce qu elle suppose qu au niveau d abstraction le plus lev un logiciel peut tre d crit de mani re satisfaisante par une fonction unique Or c est malheureusement bien souvent chose impossible notamment avec un logiciel offrant plusieurs services comme un syst me d exploitation ou un tableur Une m thode de conception privil giant les donn es conduit d finir l architec ture d un logiciel partir des donn es des objets qu il traite et non plus partir de la fonction qu il r alise Le concepteur analyse les familles d objets manipul s par le logiciel construire et taye la construction sur les am liorations successives r sultant d une meilleure compr hension de ces familles De cette fa on la description et l implantation des fonctions de plus haut niveau sont retard es le plus longtemps possible La notion d ordre ne prime pas le concepteur recense les op rations ap plicables aux familles d objets et pr cise leur d roulement mais diff re autant que 1 2 Analyse et conception 7 possible la sp cification de l ordre d application de ces op rations Deux tapes prin cipales sous tendent cette d marche Trouver les objets ils correspondent aux objets de la r alit physique ou abs traite dans laquelle le logiciel doit op rer et qui se trouve d crite dans le cahier des charges Donner une m thode syst matique permettan
137. er classe Si la r f rence calcul e au point 1 est nulle nu11 une erreur l ex cution est g n r e exception NullPointerException 5 2 Quelques exemples d erreurs li es aux m canismes d invocation 5 2 1 Utilisation des types statiques lors de la s lection des signa tures Voyons un effet li au point des m canismes d invocation d une m thode Nous utilisons volontaire un exemple sans signification pour bien mettre en valeur le probl me Consid rons le programme de la figure 5 1 Nous y definissons deux classes A et B juste pour avoir deux possibilit de typage La classe Test poss de deux m thode d instance de m me nom l une avec la signature A et l autre avec la signature B lignes 6 et 9 Le programme principal cr e une instance de Test pour pouvoir appeler les m thodes pr c dentes ligne 13 Il cr e aussi une instance de B r f renc e par une variable de type statique B ligne 14 Cette instance est aussi r f renc e par une variable de type statique A super classe de B ligne 15 Les deux invocations de m thodes des lignes 16 et 17 bien qu elles ressemblent beaucoup m me nom et m me instance en param tre ne font pas appellent aux m mes m thode La recherche des m thodes possible s effectue partir de la classe Test type statique de l expression t La premi re correspond la m thode de la la ligne 6 le type statique du de l expression en param tre effectif a est A
138. es Java une porte et une seule le h ros sur une position pr d termin e entre 2 et 5 monstres de chaque cat gorie de 3 5 tas d or de valeur comprise entre 10 et 100 cus de 0 2 armes de chaque cat gorie armure bouclier arme de poing des potions magiques l Amulette de Java si la carte est la derni re Il peut y avoir plusieurs armes et objets sur une m me case mais un seul acteur Le d roulement du jeu Le jeu se d roule en cycles comprenant une action du h ros qui joue donc le premier puis une action de chacun des monstres actifs de la carte courante dans un ordre non d fini Le h ros a le choix entre quatre types d action se d placer sur une des huits cases adjacentes ramasser un des ventuels objets de sa case franchir une porte si la case sur laquelle il se trouve est une porte Se reposer un tour pour regagner des points de vie boire une potion porter ou changer d arme de points d armure ou de bouclier contenus dans le sac quitter le jeu Un monstre peut 1 se d placer sur une des huits cases adjacentes au hazard sauf si le h ro se trouve sur une des 8 cases adjacentes Dans ce cas il frappe le heros en priorit 2 Se d placer sur une case contenant un autre monstre Dans ce cas il y a combat entre les deux monstres ramasser un des ventuels objets de sa case 4 porter une arme de poing une armure ou un bouclier celui qui a le plus fo
139. es de paye des ouvriers journaliers d une nouvelle fi liale puis les bulletins annuels des revenus imposables L extensibilit du pro gramme n est gu re favoris e par une architecture fond e sur les traitements effectuer qui sont moins stables que les structures de donn es manipuler Les relations temporelles et les interactions entre les traitements sont privil gi s d s le d but de la conception alors qu il existe souvent de nombreuses solu tions possibles qui sont difficiles choisir ce moment mais peuvent l tre ult rieurement gr ce des exp rimentations avec un prototype Il est pr f rable de concentrer le travail de conception sur les composants du syst me pour conserver un maximum de souplesse en se d gageant des contraintes de s quencement et d interfa age des modules La m thode ne tient pas compte des structures de donn es dont les descrip tions sont partag es entre les diff rents modules qui les utilisent Comme dans les biblioth ques le lien f d rateur entre les routines exploitant une m me structure c est dire la structure elle m me est perdu Certes une utilisation soigneuse de la m thode permet d en pallier certains des d fauts mais la g n ralit n est pas le propre de la m thode Son principal m rite est d tre facile comprendre et appliquer ce qui en fait un outil id al pour l ensei gnement Elle reste cependant inadapt e la conc
140. et m thodes abstraites 93 d faut sans param tre est cr lui aussi automatiquement par le compilateur si aucun autre constructeur n est explicitement d fini par le programmeur Une erreur de compilation classique survient souvent lorsque qu un ou plusieurs constructeurs avec param tres sont d finis dans une classe et qu un constructeur d une classe est dans la situation d insertion de super par d faut 4 3 5 Remarques diverses Type du r sultat d une m thode surcharg e Il faut noter que le type du r sultat d une m thode ou void le cas ch ant n est pas pris en compte pour diff rencier les signatures des m thodes afin de d terminer s il y a surcharge ou masquage Par cons quent si une m thode surcharge ou masque une autre elle doit avoir le m me type de r sultat que la m thode de la super classe Dans le cas contraire une erreur de compilation est g n r e 4 4 Classes et m thodes abstraites 4 4 1 M thodes abstraites Certaines m thodes d une classe peuvent juste avoir leur profil de sp cifi nom type des param tres type du r sultat mais sans bloc de code associ corps Une telle m thode abstraite devra tre implement e dans une sous classe Pour d clarer une telle m thode en java il suffit de faire pr c der son nom et profil du mot clef abstract et de ne mettre qu un en lieu et place du corps de la fonction Ceci s applique aussi bien des m thodes d instance
141. ette discution sans int ret 7 2 2 Quelques subtilit s dans l utilisation des clauses import Le m me nom simple de classe ou d interface peut tre utilis dans diff rent packages Ceci n est bien entendu pas un probl me puisque les packages ont des noms diff rents et donc les FQNs r sultant seront bien diff rents Mais les clauses import permettent de d signer des classes ou interfaces avec leurs noms simples il peut donc arriver qu un nom simple puisse d signer plus d une classe ou interface dans une unit de compilation Si le m me nom simple est utilis dans deux clauses import de la premi re forme concernant deux packages diff rents une erreur de compilation est g n r e En effet de telle clause charge imm diatement la classe ou interface concern e il y a donc forc ment ambi guit si on utilise le nom simple dans l unit de compilation Les clauses ne servent donc rien Par contre importer plusieurs fois un package par des clauses import de la deuxi me forme n est pas un probl me Un ph nom ne de masquage peut se produire car les clauses import de la premi re forme prime sur celles de la seconde Si deux classes de m me nom simple A sont plac dans deux packages disons p1 et p2 une unit de compilation utilisant les clauses 132 Les packages dans son ent te acc dera forc ment la classe p1 A par la notation A Pour cacc der p2 A il faudra forc ment utiliser ce FON
142. eur valeur 84 L h ritage Figure 4 2 La classe Protect ion d riv e de Equipement public class Protection extends Equipement int coefProtection int getCoefProtection return coefProtection void setCoefProtection int coef this coefProtection coef Figure 4 3 La classe Armure d riv e de Protection public class Armure extends Protection 4 3 Relation avec les l ments constituant une classe Par d faut une sous classe est form e de tout ce qu elle d finit et de tout ce que d finissent ses super classes Dans les cas des exemples de la section 4 1 la classe Armure h rite de Protection qui h rite elle m me de Equipement et donc elle poss de les attributs coefProtection masse valeur et toutes les m thodes associ es ces attributs get Masse getCoefProtection Notons tout de suite qu en Java toute classe h rite par d faut de la classe Object cf 4 7 Passons maintenant en revue les int ractions entre les l ments constituant une classe cf chapitre 3 et le m canisme d h ritage 4 3 1 H ritage et m thodes d instance Lors de l h ritage si la sous classe d finit une m thode d instance de m me nom et m me liste de types des param tres formel qu une de celle h rit e on dit que la premi re m thode surcharge derni re Le terme anglais utilis dans la documentation Java est over riding Dans ce cas l invocation de la m thode sur une instance de
143. fficient de destruction destr Ces coefficients sont constants ils ne peuvent pas varier au cours du jeu 3 6 R f rences 55 class Main class Mauhly public static void main String args private String nom Mauhly a new Mauhly affreux 15 25 private int force Mauhly pb new Mauhly pas beau gt private int vie Mauhly apb affreux pas beau Ifiivate int exp 0 a reposer y a reposer 3 MATCHES int forcep int viep Le nom nomp a force forcep vie viep gt public Mauhly String nomp nom nomp public Mauhly int forcep force forcep public Mauhly String nomp int forcep nom nomp force forcep MH is private void setVie int viep vie viep 1 gt public void reposer setVie vie 10 se reposer plusieurs fois public void reposer int nbtour for int i 0 i lt nbtour i reposer Nous introduisons la classe Arme et Armure dans le jeu class Main public static void main String args Mauhly m new Mauhly affreux 15 25 m setArme new Arme 5 m setArmure new Armure 6 La figure 3 30 montre le diagramme de classe de notre application Il est assez facile de faire correspondre le code ci dessus avec ce diagramme Il faut bien remar quer que les variables d instance de la classe mauhly r f ren ant les classes armes et armures sont repr se
144. forcep private int exp 0 public Mauhly String nomp Me sx int forcep private void setVie int viep int viep vie viep nom nomp force forcep public void reposer vie viep setVie vie 10 public Mauhly String nomp se reposer plusieurs fois nom nomp public void reposer int nbtour for int i 0 i lt nbtour i public Mauhly int forcep reposer force forcep FIG 3 26 Surcharge param trique sur les constructeurs 3 5 Le mot clef this Nous avons d j vu this apparaitre 3 6 R f rences Une r f r nce est lien typ sur un objet typ Le type de la r f rence aussi appel type statique doit tre compatible avec le type de l objet r f renc aussi appel type dynamique Une r f rence peut r f rencer null ou un objet dont le type dynamique est compatible avec le type statique de la r f rence Avant d aller plus nous allons complexifier quelque peu notre exemple Pour l instant notre monstre mauhly n est caract ris que par son nom sa force sa vie et son exp rience Rappelons nous qu il peut aussi porter une arme une armure et un bouclier 3 6 1 R f rences et graphes d objets Dans un monde objet Arme Armure et bouclier sont des objets Si un mauhly porte une arme alors l objet Mauhly r f rence un objet arme Une armure et un bouclier sont caract ris s par un coefficient de protection pr ot une arme par un coe
145. h ories issues d autres domaines Les deux sont indissociables Un logiciel n est pas seulement l ensemble des programmes informatiques asso ci s une application donn e mais aussi la documentation n cessaire la concep tion l installation l utilisation et la maintenance de ces programmes Rien que le travail n cessaire pour r diger la documentation est souvent aussi important que le travail de mise au point des programmes La demande de logiciel cro t beaucoup plus vite que l am lioration de la produc tivit Nous avons besoin d outils et de techniques puissants ainsi que de formation des quipes charg es de la construction des syst mes logiciels Il existe beaucoup d outils Nous avons choisi de pr senter Java et UML 1 1 Le cycle de vie du logiciel L ensemble des t ches n cessaires au d veloppement et la maintenance des lo giciels est parfois appel processus logiciel Il ne peut malheureusement pas tre d crit l aide d un mod le simple et unique car la nature la complexit l organisation et l encha nement des t ches sont tr s variables avec les applications Si les mod les perfectionn s font toujours l objet de recherches un certain nombre de mod les g n raux ont t mis au point prototypage transformation formelle as semblage de composants r utilisables etc L av nement du g nie logiciel en tant que discipline d ing nierie part enti re amena l
146. iable Une classe finale ne peut donc jamais tre utilis e droite du mot clef extends Ses m thodes de classes ne seront jamais masqu es et ses m thodes d instance jamais surchar g es La classe Sac cf 4 4 1 pourrait tre d finie comme finale afin que ses m thodes ne puissent pas tre surcharg e et que personne ne puisse changer l implementation choisie pour le contenu du sac 4 5 2 M thodes finales Si la d finition d une m thode d instance ou de classe est pr c d e du mot clef final elle ne pourra pas tre surcharg e resp masqu e dans une sous classe Il faut noter que toute m thode d clar e dans une classe final est implicitement final On peut la d clarer explicitement comme final ceci est redondant mais autoris Un constructeur ne peut pas tre d clar comme final On pourrait emp cher toute modification de l implantation du contenu d un Sac en d clarant comme finales toutes les m thodes actuelles de la classe Sac sans la d clarer elle m me comme finale Elle pourrait tre ainsi sous classer pour ajouter des propri t s relatives un type de sac particulier mais en emp cher de remettre en cause par surcharge ce qui est d j implement 4 5 3 Attributs finaux L influence de final sur les variables d instances ou de classes a t pr sent dans la section Il n a aucune influence sur les possibilit s de masquage Une variable d instance ou de classe d
147. in Initializing jdb OxbO class Main gt stop in Mauhly setVie Breakpoint set in Mauhly setVie gt Je demande maintenant la machine d ex cuter le programme bar exl 70 jdb Main Initializing jdb OxbO class Main gt stop in Mauhly setVie Breakpoint set in Mauhly setVie gt run run Main Orunning main 1 Breakpoint hit Mauhly setVie Mauhly 16 main 1 La machine s arr te au point d arr t que je lui ai sp cifi je peux maintenant lui demander d afficher la pile d appel gt run run Main Orunning main 1 Breakpoint hit Mauhly setVie Mauhly 16 main 1 where 1 Mauhly setVie Mauhly 16 2 Mauhly reposer Mauhly 19 3 Main main Main 5 main 1 44 Classes et objets On observe bien qu a ce moment 1a la m thode main a appel la m thode reposer qui a elle m me appel e la m thode set Vie je demande maintenant la machine d afficher le contexte d ex cution de la m thode setVie gt run run Main Orunning main 1 Breakpoint hit Mauhly setVie Mauhly 16 main 1 where 1 Mauhly setVie Mauhly 16 2 Mauhly reposer Mauhly 19 3 Main main Main 5 main 1l locals Method arguments Local variables this Mauhly 3dc15b79 viep 10 On observe ici la valeur du param tre formel viep et une r f rence appel e this Rappelez vous pour ex cuter un m thode il faut un objet receveur Doc si set
148. intin CODE 3 b b B int i this b i System out printin CODE 4 b b class Main public static void main String args B unB new B 100 Que ce passe t il exactement lors de l ex cution de l expression new B 1000 ligne 20 new r serve l espace m moire n cessaire pour les attributs d finis dans B et toutes ses super classes L appel effectif fait dans main ex cute le code du constructeur de B avec un param tre entier lignes 12 16 La premi re ligne de code de ce constructeur this ligne 13 appelle le construc teur sans param tre de B lignes 9 11 La premi re ligne de code ligne 10 du constructeur sans param tre de B n est ni un appel this ni un appel super donc un appel super a t introduit par le compilateur Ceci conduit donc l appel du constructeur sans param tre de la super classe de B A1 lignes 3 5 Dans le constructeur de A1 ligne 3 la m me chose se r p te et conduit l appel du constructeur sans param tre de la classe Object Bien entendu ce constructeur de cette classe un peu particuli re ne fait pas d appel super puisque cette classe n a pas de super classe Les variables d instance introduites par la classe Ob ject sont initialis es l aide des affectations indiqu es dans leur d claration puis le reste du constructeur de la classe Object s ex cute et retourne
149. iques repr sentant tat du mod le 154 Le graphique Figure 9 2 Le mod le de I application sac Arme destr int 0 BaArme destr int WgetDesir int EsetDestr destr int void BioString String arm Figure 9 3 Le h ro Equipement 0 equip Amure prot int 0 Y BArmure prot int 3 BgetProt int Vector setProt prot int void BtoString String armure Mauhly Borce int Bie int Bexp int 10 Enon String BMauhly nomp String forcep int viep int BjgetNom String BsetArme arme Arme void MgetArme Arme etArmure armure Armure void BgetArmure Armure BgetForce int BgetVie int EsetVie viep int void Breposer void BaddEquip e Equipement void BgetEquip Enumeration Nous avons symbolis avec des couleurs diff rentes les diff rents noeuds de l arbre de composants graphique La figure 9 4 repr sente l arbre des composants graphiques utilis s pour contruire l cran de la figure 9 3 9 2 Construire un cran graphique le mod le composite 155 Figure 9 4 Arbre de composants graphiques f Frame Z j J 4 J SE pi p2 R Panel Panel Panel nom vie force arme amure l List Label Label Label Label Label
150. itor l aggr gat form par la classe Joueur classe Window se ferme doit cr er d une mani re ou d une autre une classe implantant V interface WindowListener Il doit ensuite cr er une instance de cette classe et la li e a la fen tre concern e en appelant la m thode d instance addWindowListener de la classe Window 6 7 Interfaces et pattern visitor Le pattern visitor est un cas de choix o une interface peut tre d finie et utilis e Grossi rement ce pattern permet a un objet d une sous classe du participant Visitor d effectuer un calcul de d rouler un algorithme sur une structure d objets participant Ob jectStructure n appartenant pas forc ment 4 une m me hi rarchie de classe Le pattern permet de d finir plusieurs visiteurs participant ConcreteVisitor sous classes de Visitor sans modifier les classes des objets visit s De plus le parcour s effectue sans transtypage et selon les cas sans connaissance des relations entre objets Dans la d finition de les classes des l ments visit s participant ConcreteElement doivent tout de m me toutes h riter d une m me classe abstraite participant Element qui d finit une m thode accept Visitor Dans le cas de java qui ne poss de pas d h ritage multiple on voit que l utilisation d une interface pour l quivalent du participant Element s impose En g n ral on r serve l h ritage pour d finir ce que sont r ellement les objet
151. ive x equals x true sym trique si x equals y true alors y equals x true transitive si x equals y true et y equal z true alors x equals z true x equals null false Si nous voulons g rer l egalit entre deux objets monstres nous devons red finir la m thode equals pour deux monstres de classe Mauhly Une fa on naturelle de faire serait de d finir une m thode booleanequals Mauhlym Nous verrons dans le chapitre sur la liaison dynamique que cette d finition de la m thode equals pose en fait un probl me fondamental de suret des types li s aux lan gages objets base de classes Pour l instant il nous semble naturel de faire de fa on nous choisissons de continuer dans cette voie La figure illustre la d finition de notre m thode equal La m thode equals d finie dans Mauhly fait une comparaison variable d ins tance par variable d instance des tats respectifs des objets La comparaison des variables d instances de type primitifs force vie exp ne pose pas de probl le Par contre la variable d instance nom est en fait une r f rence sur objet de classe String Si le compilateur est assez malin pour ne cr er qu un seul objet String pour les d clarations Maulhy ml new Mauhly affreux 15 25 et Mauhly m2 new Mauhly affreux 15 25 en revanche pour m3 nous for ons la cr ation d un nouvel objet String La figure montre l tat du graphe d objet apr s la cr
152. juste au syst me h te de lui fournir une fonction drawpoint x y Une application graphique construite avec la librairie swing peut tr s bien sur une machine windows dessiner ses boutons avec un look and feel MacOS 158 Le graphique La librairie AWT d pend pour beaucoup des possibilit de la librairie graphique du sys t me h te Pour qu un composant graphique soit pr sent dans la librairie AWT il doit avoir un quivalent sur tous les syst mes h tes avec le m me comportement ce qui n est pas tou jours le cas La librairie swing s affranchit de cette limitation et permet de mettre en place des composant graphique originaux et portables Construire l arbre des composants est fondamental pour construire une interface gra phique Les feuilles fournissent les objets graphique primitifs les noeuds se comportent comme des r pertoires d objets graphiques Pour avoir un cran graphique bien form il faut en plus sp cifier pour chacun des noeuds quelle politique utiliser pour placer les composants qu il contient C est le r le des algorithmes de placement que nous allons voir maintenant 9 2 2 Gestion du placement Chaque noeud d un arbre graphique doit avoir une politique de placement des objets qu il contient Il faut se rappeler qu un conteneur est aussi un composant et qu ce titre il doit lui aussi tre dessin Comment va t il dessiner les objets qu il contient quelle position
153. la vier elle doit implanter KeyListener Implanter une interface implique de fournir l im pl mentation des m thodes d finie dans l interface Par exemple si une classe applicative d cide d implanter l interface WindowListener elle devra fournir le code des m thodes suivantes package java awt event import java util EventListener public interface WindowListener extends EventListener public void windowOpened WindowEvent e public void windowClosing WindowEvent e public void windowClosed WindowEvent e public void windowIconified WindowEvent e public void windowDeiconified WindowEvent e public void windowActivated WindowEvent e public void windowDeactivated WindowEvent e Pour que les v nements puissent tre propag s des producteurs aux consommateurs les consommateurs doivent s abonner aupr s des producteurs Dans ce but chaque producteur d v nements fournit des m thodes permettant aux consommateurs de s inscrire dans leurs listes de diffusions Par exemple un objet fen tre va fournir des m thodes addWindowListe ner WindowListener w et removeWindowListener WindowListener w Un objet bouton va fournir addActionListener ActionListener w et removeActionListener ActionListener w On voit bien ici l int r t des interfaces Le moteur de propagation d v nements peut tre crit sans pour autant conna tre les classes applicatives qui v
154. laboration d un mod le de pro cessus de d veloppement de logiciel partir d exp riences similaires dans d autres domaines Le mod le de la cascade le premier avoir t mis au point reste sans doute encore le plus utilis bien qu il ne soit appropri qu certaines classes de syst mes logiciels Il d crit le processus logiciel comme la descente en cascade d une phase une autre D finition et analyse des besoins Les services du syst me ses contraintes et ses objectifs sont tablis en consultation avec les utilisateurs clients Ils sont 1 2 Analyse et conception 5 d finis de mani re tre compr hensibles la fois par les utilisateurs et par l quipe de programmation Conception du syst me et du logiciel Une architecture d ensemble du syst me est d fini partir des besoins en logiciel et en mat riel clairement identifi s Les fonctions du syst me sont ensuite repr sent es de mani re tre facile ment transformables en un ou plusieurs programmes ex cutables Impl mentation et tests unitaires La conception est impl ment e en un en semble de programmes unit s de programmation Chaque unit est test e s par ment pour v rifier que son impl mentation correspond sa sp cification Int gration et tests du syst me Les unit s sont int gr es en un syst me com plet qui une fois test est livr au client Mise en uvre et maintena
155. le porteEnMainDroite porteEnMainGauche cf 6 4 Donc rien n oblige a priori les objets portable d implementer l interface JoueurVisitorEnableetsa m thode accept mais du point de vue de la visite du joueur on a envie que ces objets soient visit s Il faut donc que les les va riables d instances actuellement r f rences vers l interface Portable Il faut donc modifier le typage de ces r f rences Plusieurs choix s offrent l implementeur 1 Faire h riter l interface Portable de JoueurVisitable Cette solution peut nuire la r utilisation de Portable en effet elle oblige tout objet voulant impl men ter l interface Portable fournir aussi la m thode accept de JoueurVisitable 2 Cr er une nouvelle interface somme de Portableet JoueurVisitable typer les r f rences l aide de celle ci Bien entendu il faudra que les quipements portables par le joueur et visitables partir de celui ci impl mentent cette nouvelle interface La figure illustre la deuxi me possibilit une interface PortableEtJoueurVisitable est d finie par h ritage multiple de Portableet JoueurVisitable 6 7 Interfaces et pattern visitor 123 Un probl me similaire appara t lors du codage de la m thode accept pour la classe Sac qui doit tre aussi visitable En effet il faut propager la visite au contenu du sac un tableau de r f rence de la classe Equipement Il faut donc que ces r f rences nous permettent d u
156. le destinataire du message que nous conviendrons d appeler objet receveur d apr s la terminologie employ en Smalltalk La syntaxe d un envoi de message prend des formes tr s vari es selon le langage de programmation utilis Eiffel comme C et d autres langages apparent s utilise une notation point e o la cible qui est une expression d signant l objet receveur est suivie d un point introduisant le nom de l op ration effectuer et les ventuels arguments effectifs Par exemple le texte de la figure 1 6 montre comment cr er une instance de la classe POINT en utilisant une primitive sp cifique du m me langage imaginaire que pr c demment la fonc tion cr er ligne 1 Suivent trois envois de messages Le premier ligne 2 est sans retour car il invoque une m thode de transformation quivalente une proc dure pour d placer le point dans le plan Il a pour effet de modifier les valeurs des va riables d instance de l objet p1 Les deux suivants lignes 3 et 4 sont des messages avec retour puisqu ils invoquent des m thodes d acc s quivalentes a des fonctions 1 3 Ex cuter un programme 13 Les r sultats transmis repr sentant les nouvelles coordonn es du point sont stock s dans les deux variables locales abs et ord Si pour des raisons p dagogiques nous avons consid r d abord l objet avant la classe qui en donne la description il est entendu que la classe doit exister avant l
157. lic ou private selon les besoins Ici n importe quel objet peut savoir combien de vie a un objet de classe Maulhy mais seule une instance de Mauhly peut modifier cette valeur Par convention les accesseurs sont toujours pr fix s par get et le modificateur par set mot anglais que nous n avons pas pr f r traduire Quand on appelle la m thode reposer sur une instance de Maulhy les ins tructions situ es dans le corps de cette m thode sont execut es Pour pouvoir ex cuter setVie getVie 10 il faut d abord ex cuter get Vie Cette m thode est appel e sur l objet lui m me c est donc bien la m thode get Vie que nous avons d finie que nous allons appeler Cette m thode renvoie la valeur associ e a la variable 36 6 Chaque m thode d finit le comportement exact correspo dant a son action dans le corps de la m thode situ entre les acco lades Quand la m thode est ap pel e c est ce code qui est ex Classes et objets class Mauhly private String nom private intforce private int vie private int exp 0 cut R D Les variables d instances peuvent tre acc d es dans le corps des m thodes Ici nous af oe oo fectons 10 la variable force public int getExp 10 est bien un entier affectation ST exp est donc possible D Les m thodes d instances ae public int getVie renvoie toujours une valeur de nn return vie retour sa
158. machine virtuelle gr ce un d sassembleur appel javap javap c Hello Compiled from Hello java class Hello extends java lang Object Hello public static void main java lang String Method Hello 0 aload_0 1 invokespecial 6 lt Method java lang Object gt 4 return Method void main java lang String O getstatic 7 lt Field java io PrintStream out gt 3 Idc 1 lt String hello world gt 5 invokevirtual 8 lt Method void printin java lang String gt 8 return Sans chercher comprendre le contenu et le r le des instructions on observe bien que le corps des m thodes a t traduit dans un langage plus primitif que Java ldc invokevirtual return etc sont des instructions de la machine virtuelle 4 L une des classes du programme doit obligatoirement contenir une m thode appel e main qui constitue le point d entr e du programme et doit avoir le profil suivant class unExemple public static void main String args HM Le programme s ex cute en fournissant le nom de la classe en question a la machine virtuelle invoqu e gr ce la commande java java Hello Attention ici Hello est bien le nom d une classe et non celui d un fichier 5 La variable d environement CLASSPATH contient la liste des r pertoires ot se trouvent les fichiers de code ex cutable d extension class La machine virtuelle parcourt ces r pertoires dans l
159. malltalk prennent une autre strat gie et pro pose une encapsulation bas e sur les objets Seul l objet lui m me peut acc der son tat Une m thode est basiquement une op ration qui prend des param tres acc de l tat de l objet et renvoie un r sultat Java est un langage typ les param tres sont donc typ s et le r sultat aussi La forme g n rale de toute d claration de m thode est la suivante lt controleur d acces gt lt type retour gt lt nom methode gt liste parametres formels body La port e d un param tre formel se limite au corps de la m thode dans lequel il est d clarer Cela signifie que viep n a de sens que dans le corps de set Vie La notion de port e des identificateur est tr s importante dans les langages informatique en g n ral La port e d un nom de variable d instance est limit au corps de classe La port e d un nom de classe est limit au programme dans lequel il est utilis Ce qui signifie que pour un programme il ne peut exister deux classe portant le m me nom La m thode reposer est int ressante cette m thode s appuie sur des m thodes organiques que tout programmeur java s attend a trouver dans la d finition d une classe Le reflexe est le suivant pour toute variable d instance je d finit une m thode d acc s et une m thode de modification La variable d instance est d clar e private l accesseur et le modificateur pub
160. mbolyser les differentes direction dans lesquelles les monstres peuvent se d placer La d finition de ces constantes permet par la suite de manipuler des directions et non des entiers La derni re ligne permet de cr er un g n rateur de nombres al atoires La notation java util Random permet de r f rencer la classe Random situ e dans le package java util Attention la classe s appelle bien java util Random et non Random ce qui est une source courrante d erreur de compilation en Java Le g n rateur de nombre al atoire est bien un objet r f renc par une variable de classe Ceci est une construction tout fait normale L utilisation d une variable de classe est ici tout fait pertinente Le g n rateur est partag par toutes les instances de la classe Mauhly Il est initilias quand la classe Mauhly est charg e par le chargeur de classes et toutes les instances demanderont un nombre al atoire au m me g n rateur ce qui le rend plus efficace public Mauhly String nomp int forcep int viep Region region nom nomp force forcep vie viep this region region region setMauhly this public void setRegion Region region this region region public Region getRegion return region 3 11 Exemple recapitulatif 79 public int getVie return vie private void setVie int viep vie viep public void reposer setVie getVie 10 LA partie ci dessus est t
161. me exemple d utilisation de la fabrique de monstres et g n rer toutes les classes impliqu es dans un r pertoire temporaire tmp nous pouvons taper la ligne de commande suivante javac classpath d tmp TestFabrique2 java Apr s cette commande rien n est apperu dans le r pertoire courant par contre dans tmp on obtient TestFabrique2 class fr tmp fr loria tmp fr loria tortueJava tmp fr loria tortueJava moteur tmp fr loria tortueJava moteur FabriqueDeMonstres class Monstre class On constate bien que le compilateur a reconstitu une aborescence similaire celle de nos packages et des sources On voit aussi que les classes du package sans nom sont plac s directement dans le r pertoire pr cis dans l option d ici la classe TestFabrique2 Par contre le sous package fr loria tortueJava configl n a pas t g n r En effet la classe TestFabrique2 ou les classes qu elle utilse ne r f rencent aucune classe de configl puisque nous avons volontairement utilis un m canisme de chargement dy namique l ex cution Pour la g n rer la classe LeLoria nous pouvons lancer toujours partir du m me r pertoire par une ligne de commande de la forme javac classpath d tmp fr loria tortueJava configl LeLoria La classe LeLoria r f rence explicitement les autres classes du package configl elles sont donc aussi g n r r es dans un nouveau r pertoire config1 au bin
162. me nom au sein de la m me classe Il en est de m me pour les m thodes Par contre une m thode et une variable d instance peuvent porter le m me nom voir figure 3 2 Enfin les conventions de nommage sont les suivantes Un nom de classe commence par une majuscule Si le nom est un nom com pos on crit le mot sont sans tirets chaque d but de mot prend une majuscule par exemple imaginons que nous ayons besoin d une classe Bouclier de fer la classe s appelera BouclierFer Un nom de variable d instance commence par une minuscule Si le mot est compos chaque mot suivant prend une majuscule Par exemple supposons que nous ayons besoins d une variable d gat de l arme nous pourrons l ap peler degatArme Un nom de m thode est soumis au m me convention qu un nom de variable d instance Il n y a pas d ambiguit les parenth ses suivent toujours un nom de m thode il est possible de d clarer plusieurs instructions par ligne Par exemple private int force private int vie private int exp 34 D d finition du contr le d ac c s Une variable d instance peut tre d clar e public ou private Cela signifie ici que seules les instances de la classe Mauhly peuvent acc der cette variable 6 Chaque variable d instance est typ e Cette variable est de type int pour entier elle n ac cepte donc que des entiers pour valeur 6 Toute variable d instanc
163. ment Protection e2 new Protection el print 0 e2 print el e2 el print 0 Equipement e2 print 0 La liaison dynamique est incontournable et toujours pr sente pour l appel d une m thode d instance Il y aun moyen en java de modifier le point de d part de la recherche de m thode dans arbre d h ritage du type dynamique la r f rence pr d finie super Cette r f rence sp ciale du m me ordre que la r f rence this permet de r f rencer dans le code d une 4 3 Relation avec les l ments constituant une classe 87 void print lt super gt print System out printin getValeur 4 coefficient de protection getCoefProtection FIG 4 3 Exemple d utilisation de super m thode d instance ou d un constructeur objet courant this comme un objet ayant pour type dynamique la super classe du type dynamique de this Nous reviendrons en d tail sur ce m canisme dans le chapitre 5 Illustrons ceci de nouveau par notre m thode print Actuellement cf Fig 4 5 nous avons crit la m thode print de la classe Protection en y recopiant le code de la m thode print lignes 7 4 12 de Equipement et en ajoutant du code r ellement relatif aux attributs de Protection lignes 13 et 14 Ona finalement crit deux fois le code de la m thode print de Equipement On a envie d appeler la m thode print de la super classe lors de la d finition de la m thode print d
164. ment Joueur ou inter faces Portable sans trop nous poser de questions Le nom indiqu dans la clause class nous a permis de les utiliser dans le reste de notre code Ce nomage plat n est qu une utilisation r duite de ce que propose java il est possible de regrouper des d finitions de classes et d interfaces dans un m me package Un package permet de d finir des biblioth ques de codes et ainsi facilite la r utilisation distribution structuration d une application pour viter des conflits de noms entre parties d velop p es par des quipes diff rentes L effet principal des package est de structurer l espace de nom des classes et interfaces La notion de package va aussi introduire quelques raffinements aux contr les d acc s classes et l ments d une classe vue jusqu ici 7 2 Cr ation utilisation noms Syntaxiquement un package ne se cr e pas il existe implicitement lorsque que l on place une classe dans un package grace a la clause package Un nom de package peut se structurer comme un nom de r pertoire mais en utilisant des points pour s parer un package d un sous package Si un package voir une application a pour vocation d tre distribu e via Internet il est n cessaire de d finir des noms de packages uniques La sp cification du langage Java recommande d utiliser le nom de domaine Internet garanti unique de l entreprise ou institution qui d velop
165. ment il faut qu un new ai eu lieu pour que l on puisse d terminer la classe exacte de l objet et donc acc der la bonne m thode Le choix de la m thode s effectue du bas vers le haut dans l arbre d h ritage partir du type dynamique On consid re d abord cette classe puis ventuellement ses super classes pour trouver une m thode de m me nom et signature Illustrons ceci dans un petit programme Java donn dans la figure Fig 4 6 Le r sultat de l ex cution de ce programme est donn dans la figure 4 2 Sur la ligne 3 de ce programme est cr e une instance de Equipement le type dynamique de l objet r f renc par la va riable e1 est donc Equipement De la m me fa on est cr e sur la ligne 4 une instance de Protect ion r f renc e par la variable e2 La ligne 5 conduit donc l ex cution de la m thode d finie dans la classe Equipement alors que les lignes 6 8 et 9 conduisent celle la m thode d finie dans la classe Protection En effet l affectation parfaitement licite cf dans une r f rence de type statique diff rent ligne 7 ou un cast ligne 9 vers une super classe ne change en aucun cas le type dynamique de l occurrence consid r e qui reste le point d part pour rechercher la m thode ex cuter dans l arbre d h ritage Figure 4 6 Utilisation d une m thode surcharg e public class Test_ print public static void main String args Equipement el new Equipe
166. mes approch s Dans java le m canisme est parfaitement int gr par exemple il n y a pas se soucier des effets qu un arr t abrupt d une m thode peut avoir sur le syst me de synchronisation De plus il tire parfaitement avantage des aspects classes et objets du langage On peut dire qu en Java la sp cification des exceptions pouvant provenir d une m thode compl te la signature de celle ci Ceci est tr s vrai puisque le compilateur fait des v rifications statiques pouss es concernant les exceptions 1 Les auteurs sont des enseignants chercheurs qui cherchent avoir la paix 8 2 Anatomie et cycle de vie 145 8 2 Anatomie et cycle de vie Sh matiquement une exception est une instance de classe particuli re qui est confi e l environnement d ex cution afin de trouver un point dans la pile l ex cution qui soit capable de la traiter de la capturer 8 2 1 Des objets et des classes D apparition d un probl me se traduit par la cr ation d un objet et la communication de celui ci au contr le d ex cution de la machine virtuelle par l instruction throw lt r f rence d objet gt Pour cette derni re action on parle souvent de lever une exception La classe de cet objet doit h riter imp rativement de la classe pr d finie java Throwable En g n ral pour refl ter des probl mes de logique dans l utilisation d une m thode on choi sit de cr er une instance d une sous
167. mes plac dans le cas de l invocation d une m thode d instance Mais syntaxiquement rien ne diff rencie une invocation de m thode d instance de celle d une m thode de classe Il faut donc dans le cas g n ral v rifier que la m thode s lectionn e apr s les deux tapes pr c dente un sens dans le contexte de l appel Il faut v rifier entre autre que si la m thode est une m thode d instance l invocation a bien lieu dans un contexte o this a un sens Il faut bien noter que ces trois tapes statiques ont une influence sur le code g n r pour l invocation consid r e Il faut avoir en t te que la signature exacte de la m thode cherch e est conserv e dans le code parmi d autre informations Les pr traitements faits par le compilateur rendre plus simple et efficasse la recherche de ma m thode appeler lors de l ex cution method dispatch 5 1 2 Liaison l ex cution Voyons maintenant comment est valu le code g n r pour notre expression d invoca tion en utilisant bien entendant les informations pr calcul es dans la section pr c dente L aussi plusieurs tapes sont effectu es 1 D termination de la r f rence d objet sur laquelle a lieu l invocation Dans les cas des formes syntaxiques 1 et 3 cette r f rence est simplement this objet concern par le bloc de code en cours d ex cution this a forc ment un sens cet endroit car cela a t v rifi l
168. mettre en vidence des l ments qui seront sirement aussi des objets la carte et les paysages D terminer comment ils seront repr sent s va mettre en vidence d autres objets et ainsi de suite Nous y reviendrons plus tard Pour l instant seul le h ros avec sa massue et son armure nous int resse 3 1 2 Le comportement d un objet Comme nous l avons dit pour commencer chaque objet est dot d une indentit d un tat et aussi d un comportement Tachons donc de d finir une premi re bauche du comportement du h ros partir du cahier des charges e Le h ros peut se reposer pour augmenter son capital de points de vie L objet heros doit donc tre dot d une premi re op ration ou plut t selon le vocabulaire sp cifique de Java d une m thode sans param tre not e reposer Donc lorsque cette m thode est invoqu e elle augmente le nombre de points de vie du h ros Compl tons la repr sentation graphique du h ros hero nom momo54 Point de Vie 100 Exp rience 41 Force 18 Arme Porte armure Port e sa e Le h ros peut se d placer dans une des cases adjacentes celle o il se trouve c est dire selon huit directions possibles comme l indique la figure 3 1 V vidence la m thode correspondante deplacer prend la direction du d placement en param tre En outre si le h ros gagne une case d j occup e par un monstre ce dernier l
169. n entendu les types dynamiques des l ments de ce tableaux seront des sous classes non abstraites de Equipement PotionDeVie Armure Pour par exemple calculer la masse total d un sac lignes 14 18 il suffit de savoir que ce sont des quipements disposant d une m thode getMasse et l ex cution la liaison dynamique permet d acc der la m thode getMasse correcte selon le type dynamique de l l ment consid r Il faut aussi noter que notre sac actuel n a ni masse ni valeur propre Une classe Sac r aliste devrait avoir au moins une m thode de plus remove Equipement pour supprimer un l ment contenu dans le Sac Figure 4 11 Utilisation de m thodes abstraites et impl mentation du pattern Compo site public class Sac extends Equipement Equipement contient new Equipement 10 int cptEquipement 0 void add Equipement e if cptEquipement lt contient length contient cptEquipement e cptEquipement else exception void setValeur int valeur int getValeur int resultat 0 for int i 0 i lt cptEquipement i resultat contient i getValeur return resultat void setMasse int masse int getMasse int resultat 0 for int i 0 i lt cptEquipement i resultat contient i getMasse return resultat 4 4 2 Classes abstraites et probl me d instanciation Une erreur classique est de penser d une classe abstraite n
170. n un bloc d une clause try ou catch Il en va de m me pour la valeur du r sultat d une m thode positionn par return il peut tre masqu par une exception ou un autre return L exemple et la trace de son ex cution xhibe quelques cas de tels masquage Le premier appel m thode m correspond une ex cution sans surcharge La clause return de la ligne 9 est vue normalement puis le bloc de la clause finally est ex cut mais ne fait rien de particulier puisque le param tre effectif vaut 1 Par contre lors du deuxi me appel la valeur positionn par la clause return de la ligne 9 est masqu e pas celui de la ligne 13 Lors du troisi me appel la valeur positionn est perdue car en fait le programme s arr te brutalement lors de la cr ation et du lev de l exception de la ligne 14 Figure 8 5 Exemple de classe d exceptions class Masquage public static void main String args throws A System out printin m 1 m 1 System out printin m 2 m 2 System out println m 3 m 3 private static int m int p throws A try return 10 finally switch p case 1 break case 2 return 20 default throw new AQ 150 Exceptions et entr es sorties m 1 10 m 2 20 new A at Masquage m Masquage java 14 at Masquage main Masquage java 5 Exception in thread main FIG 8 1 Ex cution de l exemple de la figure 9 Le graphique 152 Le graphique 9 1 Applications graphique
171. nce Le syst me est install et mis en service La maintenance comprend la corrections des bogues jusqu alors non d tect es l am lioration de l impl mentation ainsi que l enrichissement et l adaptation du syst me au fur et mesure que de nouveaux besoins apparaissent ou que les conditions d exploitation changent Tout n est pas si simple car dans la pratique ces phases se chevauchent et in teragissent Par exemple les probl mes correspondant aux besoins sont bien souvent identifi s au cours de la conception ceux de la conception lors de l impl mentation etc n cessitant une s rie d aller retours entre les diff rentes phases 1 2 Analyse et conception Il reste trouver comment obtenir des modules avec les qualit s requises Un sys t me logiciel ou pour simplifier un programme permet d effectuer des traitements sur des donn es comme le r sume la c l bre formule Algorithmes Structures de donn es Programmes D une mani re g n rale un concepteur a donc le choix entre les traitements et les donn es pour tablir les bases de l architecture de son programme 1 2 1 Conception par traitements et conception par objets La m thode de conception par traitements la plus classique est sans doute l ana lyse fonctionnelle descendante qui a d j t voqu e dans le paragraphe elle proc de par affinements successifs en divisant r cursivement la t che accomplir en sou
172. ne mani re ou d une autre d acc der l impl mentation de l interface JoueurVisitable Les quipements sont a priori des objets d di s tre ramass s par le joueur Dans ce cas il ne semble par absurde d imposer tout quipement d impl menter cet interface Nous pouvons modifier la d finition de la classe abstraite Equipement en d clarant qu elle im pl mente l interface JoueurVisitable La figure 6 8 montre le code de cet ajout C est d ailleurs le seul ajout fait dans la classe Equipement la m thode accept requise par l interface JoueurVisitable n est pas impl ment e Elle reste donc une d claration de m thode abstraite h rit e par les sous classes de Equipement Toutes les sous classes non abstraites de Equipement devront par contre impl menter concr tement cette m thode cf 4 4 Du point de vu du typage toute r f rence vers Equipement ou une de ses sous classes est aussi une r f rence vers JoueurVisitable La figure 6 10 montre comme la classe Arme peut impl menter les interfaces Portable JoueurVisitable et PortableEtJoueurVisitable Figure 6 6 Une interface permettant un objet d tre visit par un JoueurVisitor interface JoueurVisitable void accept JoueurVisitor v Figure 6 7 Une classe Joueur pouvant tre visit e par un JoueurVisitor public class Joueur implements JoueurVisitable private int masse 80000 PortableEtJoueurVisitable porteEnMainD
173. nes et externes Un object interne peut observer directement l tat de son objet externe m me si cet tat est priv Prenons l exemple de la carte des tortues java Nous voulons contruire une repr sentation graphique de cette carte Nous voulons donc contruire un objet graphique qui repr sente cette 180 Le graphique carte Pour mettre en place cet objet graphique il faut acc der l tat de l objet carte Bien sur nous pouvons cr er une classe CarteGraphique avec une relation 1 1 avec la classe carte nous pouvons aussi consid rer cet objet graphique comme le repr sentant graphique de la carte et ce titre le d clarer comme instance d une classe interne de Carte La diff rence entre les deux solutions n est pas tr s grande d un point de vue op rationel Figure 9 25 Utilisation des classes internes import java awt import java awt event import javax swing class Carte private Region regions public Carte int nbrow int nbcol regions new Region nbrow nbcol for int i 0 i lt regions length i for int j 0 j lt regions i length j regions i j new Region this i j public Region getRegion int x int y try return regions x y catch ArrayIndexOutOfBoundsException e return null public JComponent display JComponent c new IHM return c class IHM extends JPanel public IHMO this setLayout new GridLay
174. nf pour le constructeur que nous verrons juste apr s Ici int est le type de la valeur de re ree i P private void setVie int viep tour la valeur retourn e est sp ci even SRE di e dans le corps de la m thode HER par le mot clef return La va leur retourn e doit avoir un type compatible avec le type de la va leur de retour ae co Le mot clef void signifie que la m thode ne retourne rien D Les parenth ses signifient que cette m thode ne prend au cun param tre public int getForce _returrrforces public void reposer SetVie getVie 10 1 e I lt gt class Mauhly FIG 3 5 la classe Maulhy les m thodes d instance vie Disons qu cet instant cette variable vaut 10 get Vie renvoie donc 10 Il ne reste plus qu ex cuter set Vie 10 10 soit setVie 20 20 forme ici ce qu on appelle le param tre effectif de la m thode setVie Le pa ram tre formel de setVie savoir viep comme vie param tre va prendre la valeur du param tre effectif pour ex cuter les instructions situ e dans le corps de la m thode setVie Le type du param tre effectif doit tre compatible avec le type du param tre formel ce qui est bien le cas ici Le corps de la m thode set Vie peut tre execut e maintenant vie viep va tre interpr t comme vie 20 La variable d instance vient d tre modifi e La m thode set Vie termine son e
175. nn e ordonn e fin proc dure FIG 1 4 D finition de la classe POINT directement dans la structure de donn es repr sentant le point sans la dupliquer ces m thodes ne retournent donc pas de r sultat La description proprement dite de la classe est le fait du concepteur qui choisit la structure de donn es pour repr senter les objets et qui crit le corps des fonctions au sens informatique du terme et des proc dures correspondant aux m thodes La structure est d finie par un ensemble de variables comme le montre la figure 1 4 qui donne le texte de la classe POINT dans une syntaxe imaginaire voulue la plus lisible possible En l occurrence le concepteur a d cid de repr senter un point par deux valeurs r elles figurant son abscisse et son ordonn e Le mod le de point ainsi d fini sert construire les objets qui sont les occur rences ou encore les instances de la classe POINT Un objet est cr par instancia tion de sa classe gr ce une op ration sp ciale dont l usage et la nature diff rent selon les langages La figure 1 5 met en vidence le mod le des objets dans la d 12 La conception de logiciel FIG 1 5 L instance p1 est cr e sur le mod le d fini par sa classe POINT abs ord REEL Variable pour d signer un objet de la classe POINT pl POINT Cr er un objet de la classe POINT d abscisse 100 et d ordonn e 25 pl cr er 100
176. nne un exemple de propagation de l exception lev e dans la m thode de Vexemple 8 2 extrait de la classe Plateau L appel de la m thode calculerCaseSuivante ligne 3 est comme l avons vu sur la ligne 12 de l exemple pr c dent succeptible de lever une exception Si cela est le cas cet invocation de m thode retourne imm diatement ainsi que celui de la m thode appelante ici deplacer L exception lev e DeplacementHorsDu PlateauException est une exception verifi e donc cet arr t et propagation n est pos sible que grace la clause throws de la ligne 2 Figure 8 3 Propagation d une exception public void deplacer Monstre qui Case depuis int direction throws DeplacementHorsDuPlateauException Case suivante calculerCaseSuivante depuis direction suivante abrite qui depuis abrite null qui estSur suivante Un certain nombre d instructions du langage ou de m thode des classes de base de l en vironnement g n rent des exceptions non v rifi es Citons en deux exceptions java lang NullPointerExcept ion qui est lev e lorsque l on essaye d acc der une variable ou une m thode partir d une r f rence d objet null java lang ArrayIndexOut OfBoundsException qui est lev e lorsque l on acc de aux l ments d un tableau avec un index n gatif ou sup rieur la taille du tableau par la notation entre autres 148 Exceptions et entr es sorties 8 2 4 Capt
177. nous pouvons consid rer un objet comme une calculette dont les touches symbolisent les op rations qui peuvent lui tre appliqu es La figure 1 2 sch matise sous cette forme l objet p1 repr sentant un point du plan cart sien L ac tion d appuyer sur une touche provoque l ex cution de l op ration correspondante Si un r sultat doit tre d livr il appara t ensuite dans la fen tre d affichage de la calculette Par exemple les touches x et y permettent de consulter l abscisse et l or donn e courantes du point qui valent respectivement 100 et 25 Apr s l ex cu tion de l op ration en_haut 3 l abscisse reste inchang e 4 mais l ordonn e est augment e d une unit 5 10 La conception de logiciel interface de la classe POINT m thodes d accaes x R EL Consulter l abscisse du point y R EL Consulter l ordonn e du point m thodes de transformation en_haut Ajouter I l ordonn e du point _droite Ajouter I l abscisse du point en_bas Retirer 1 l ordonn e du point a_gauche Retirer 1 l abscisse du point d placer dx REEL REEL D placer le point de dx unit s en abscisse et dy unit s en ordonn e FIG 1 3 L interface de la classe POINT Le principe du masquage d information est bien respect Pour paraphraser la formule donn e en prologue au paragraphe nous pouvons dire
178. nt es par des relations 56 class Mauhly private String nom private int force private int vie private int exp 0 public Mauhly String nom int force int vie nom this nom force this force vie this vie public Maulhy String nom this nom 0 0 public Mauhly String nom int force this nom force 0 Classes et objets public int getForce return this force public int getExpO return this exp public int getVie return this vie private void setVie int vie this vie vie public void reposer this set Vie this getVie 10 FIG 3 27 this class Arme private int destr 0 public Arme int destr this setDestr destr public int getDestr return destr private void setDestr int destr this destr destr class Armure private int prot 0 public Armure int prot this setProt prot public int getProt return prot private void setProt int prot this prot prot FIG 3 28 Classes Arme et Armure La figure 3 31 montre le diagramme de s quence de notre application La figure 3 32 montre le diagramme de s quence de notre application Ces diff rents diagramme permettent d avoir une vue globale de I application Le diagramme de classe illustre la statique du programme les diagrammes de s quences et de collaboration la dynamique 3 6 2 Affectation de
179. nt combattent En se d pla ant les monstrent modifient l tat des r gions concern es qui signalent ce changement d tat leurs vues respectivent qui se remettent ainsi jour import java awt import java awt event import javax swing class Main public static void main String args Carte carte new Carte 5 5 final Mauhly monstres new Mauhly 5 for int i 0 i lt monstres length i monstres i new Mauhly momo i 10 10 carte getRegion i i JFrame frame new JFrame Minitortues frame getContentPane add carte display BorderLayout CENTER JButton jb new JButton play jb addActionListener new ActionListener public void actionPerformed ActionEvent e for int j 0 j lt monstres length j monstres j play ps 9 5 Principe du MVC 189 frame getContentPane add jb BorderLayout SOUTH frame pack frame setVisible true import javax swing import java awt event import java util class Region extends Observable relation inverse de la Carte Region 1 1 private Carte carte private int x private int y relation Carte Mauhly 0 1 dans ce sens private Mauhly mauhly null public Region Carte carte int x int y this carte carte this x x this y y public void setMauhly Mauhly mauhly this mauhly mauhly signaler le changement d tat this setChanged
180. objet externe Cet acc s privili gi peut faciliter la remise jour de la vue lors des notifications 3 Par construction c est le mod le qui doit fournir une m thode pour construire la vue Afficher une vue fait alors partie du comportement du mod le Cette fa on de faire peut tre restrictive Il est parfois plus facile de construire s par ment les vues et le mod le et g rer les attachements par la suite 9 5 Principe du MVC 183 Le mod le repr sente l objet ou les objets applicatifs Dans notre exemple la classe Maulhy joue le r le du mod le Un mod le peut avoir 0 ou n vues qui lui sont associ es Cela signifie deux choses 1 Quand une vue est cr e elle doit s enregistrer aupr s de son mod le Le mod le doit donc fournir une m thode du type addObserver Observer o 2 Quand le mod le change d tat il doit appeller sur l ensemble des vues enregis tr es la m thode update Un mod le est donc un objet abstrait g rant une liste de vues Il peut donc tre re pr sent par une classe abstraite La classe java util Observable joue ce r le Dans la figure 9 28 la classe Mauhly notre mod le h rite de Observable et donc h rite des m thode addObserver notifyObserver Le controleur provoque les changements d tats sur le mod le Conr tement c est lui qui appelle les m thodes de changements d tat Dans notre exemple
181. oid Ecombattre ennemi Mauhly void EXgetVie int EsetVie Viep int void reposer void FIG 3 63 Diagramme de classe physique pour la gestion de la carte class Main public static void main String args Carte carte new Carte 5 5 Mauhly monstres new Mauhly 5 for int i 0 i lt monstres length i monstres i new Mauhly momo i 10 10 carte getRegion i i for int i 0 i lt 10 i for int j 0 j lt monstres length j monstres j play FIG 3 64 Programme principal 77 78 Classes et objets private String nom private int force private int vie private int exp 10 private Region region La partie ci dessus d crit l tat d un monstre de classe Mauhly comme nous le d cri vons depuis le d but de ce chapitre Il faut bien remarquer la r f rence region repr sentant le fait qu un monstre est toujours situ sur une r gion C est l implantation de la relation Maulhy Region dans le sens Maulhy vers Region public static final int NORD 0 public static final int NE 1 public static final int EST 2 public static final int ES 3 public static final int SUD 4 public static final int SO 5 public static final int OUEST 6 public static final int ON 7 private static java util Random random new java util Random Cette partie illustre une utilisation classique des constantes en Java Nous utilisons ici des constantes pour sy
182. onnu par son comportement les services offerts ind pendamment de sa repr sentation physique Les objectifs exprim s pr c demment sont atteints Abstraction de donn es les raisonnements sous jacents l analyse du pro bl me traiter sont effectu s en termes de concepts abstraits qui sont ensuite mod lis s directement par des classes La g n ricit accro t encore la puis sance d abstraction de donn es Modularit et compatibilit le logiciel est d coup en modules qui peuvent tre compil s s par ment et group s en biblioth ques R utilisabilit l h ritage permet de d finir incr mentalement de nouvelles classes partir des classes existantes Extensibilit une classe tant d finie en termes de services une modification de la structure de ses objets n a que peu ou pas d incidence sur la mani re dont les clients de la classe utilisent ces objets Lisibilit interface de la classe en donne un mode d emploi clair et pr cis Le code source est d autant plus lisible que les donn es des objets sont manipul es gr ce aux op rations d clar es dans l interface l implantation physique restant cach e 1 2 2 Les notions de classe et d objet Il est temps d aborder les notions de classe et d objet sur des bases simplifi es plus pragmatiques et plus g n rales et d introduire quelques l ments du vocabulaire propre au domaine De fa on imag e
183. ont recevoir ces v nements Il suffit de connaitre les interfaces auxquelles ces classes applicatives devront se conformer Ce type de construction est g n ralement appel framework Jusqu a pr sent nous avons mis en place les producteurs d v nements en construisant les arbres de composants graphiques nous pouvons cr er les consommateurs d v nement en implantant les interfaces ad quates nous pouvons enregistrer ces consommateurs aupr s des producteurs il ne manque plus qu un acteur le diffuseur d v nements De mani re tr s imag e lorsqu un v n ment est produit il est stock dans la queue d v nements Un processus tournant dans la machine virtuelle un thread se charge de diffuser les v nements Cette queue d v nement permet de s parer la production d v ne ment de la diffusion d v nement Tr s concr tement un autre v nement peut tre produit sans pour autant que le premier soit d j diffus Il n est donc pas n cessaire d attendre qu un v nement soit compl tement trait avant de pouvoir en trait un autre Le diffuseur d v nement se base sur les d claration de diffusion pour appeler sur les classes applicatives 9 3 G rer les v nements le mod le par d l gation 165 les m thodes d finies dans les interfaces i e actionPermormed ActionEvent e Mouse Presses MouseEvent e Le mod le par d l gation est un mod le simple de gestion
184. ormal puisque les deux m thodes r f rence et donc se partage le m me objet Dans notre exemple l ex cution de la m thode combattre a pour effet de dimi nuer les points de vie du monstre combattu la fin de l ex cution de la m thode combattre m1 getVie imprime 30 10 20 Ce comportement n est pas toujours souhaitable il peut tre utile parfois que la m thode appel e n ait aucun effet de bord i e que tout changement op r par elle ne soit visible que par elle Dans ce cas il faut faire en sorte qu elle n op re que sur des copies d objets et non sur les objets originaux 5 8 62 Classes et objets class Mauhly public Mauhly Mauhly m private String nom nom m nom private int force force m force private int vie vie m vie private int exp 10 exp m exp arme m arme private Arme arme null armure m armure private Armure armure null RES public Mauhly String nomp int forcep int viep class Main nom nomp public static void main String args force forcep Mauhly m1 new Mauhly affreux 15 25 vie viep m1l setArme new Arme 5 m1l setArmure new Armure 6 Mauhly m2 new Mauhly m1 un copy constructeur dont le code n est pas un exemple a suivre Mais c est pour la bonne cause FIG 3 40 Copie d objet 3 6 4 R f rence et copies d objets Copier un objet n est pas chose facile dans tout langage objet En effet comme nous l avons v
185. otection un quipement avec en plus un coefficient de protection r sistance Arme un quipement avec un coefficient d efficassit d gat Potion un quipement qui peut s appliquer sur un monstre ou au joueur On dit que les classes Arme Protectionet Potion h ritent ou d rivent de la classe Equipement On dit aussi qu elles sont sous classes de Equipement R ciproquement on dit que la classe Equipement est super classe des classes Arme Protection et Potion Le m canisme d h ritage peut s encha ner plus d une fois pour construire de nouvelles classe partir d une classe elle m me d finie par h ritage Nous pouvons ainsi introduire dans notre exemple Deux formes de Protections BouclieretArmure Trois types d Armes Massue Glaive Hache Deux types de Potions PotionDeVie PotionParalysante Pour l instant ces sept derni res classes sont juste une simple classification aucun nouvel attribut ou m thode n est ajout pour les d finir Donnons la notation UML associ e la d finition des classe introduites par h ritage Les fl ches avec une extr mit triangulaire blanche se lisent A h rite de B si A est la source de la fl che Le diagramme de classe UML de la figure 4 1 donne une id e de cette notation pour notre exemple 4 2 Syntaxe en Java 83 Equipement masse int valeur int Paget asse set asse _ sgetValeur DM setV aleur A se Ca ih Le
186. our les piles d entiers les piles de caract res les piles de salari s etc La rubrique Fonctions num re les services disponibles sur les objets repr sentant les occurrences du type PILE Chaque service est exprim par une fonction math matique dont est donn e la signature La fonction de construc tion fournit une nouvelle occurrence du type elle correspond la cr ation d un objet Les fonctions d acc s op rent sur une occurrence du type et four nissent une valeur d un type autre elles correspondent a la consultation des donn es de l tat d un objet Les fonctions de transformation fournissent une nouvelle occurrence du type a partir de l occurrence sur laquelle elles sont appliqu es elles correspondent la modification de l tat d un objet Certaines fonctions dites partielles et indiqu es par une fl che barr e ne sont pas d finies pour toute occurrence du type La rubrique Pr conditions en pr cise les conditions d application ainsi il n est possible ni de retirer un l ment ni de consulter le sommet d une pile vide Les divers services doivent respecter les propri t s d une pile qui ne peuvent pas tre d crites par la seule donn e de fonctions et qui sont donc sp cifi es dans la rubrique Axiomes En particulier les deux derni res lignes noncent 8 La conception de logiciel Type PILI Fonctions fonctions de construction cr e
187. ous les objets en fonction des requ tes du programme des Tortues Java et qui leur attribue un num ro ou cl unique disons pour simplifier 1 pour le premier objet 2 pour le second etc afin de pouvoir les r f rencer de mani re univoque La cl d un objet ne changera jamais au cours de l existence de l objet Convenons que les objets seront repr sent s dans la suite sous la forme graphique 3 1 Objets et r f rences 29 suivante hero nom momo54 Point de Vie 100 Exp rience 41 Force 18 Arme Port e Massue Armure Port e ArmureAirain Sac vide Cette repr sentation est videmment assez na ve le monde du programme des Tortues Java tant en fait constitu d un r seau d objets En effet si dans le cahier des charges le h ros porte une massue dans le monde objet il r f rence un objet repr sentant la massue qui a ses propres identit tat et comportement Il en est de m me pour port e et le sac Une repr sentation plus fid le de l objet h ros serait donc comme suit hero nom momo54 Point de Vie 100 Coef Destruction 2 Exp rience 41 Force 18 Coef Protection 2 ee Baa Sac Es Contenu Vie Si nous poussons ce raisonnement plus avant momo54 est logiquement un ob jet de type cha ne de caract res dont la valeur est la cha ne momo54 En toute rigueur il devrait galement en tre de m me pour les entie
188. out fait classique elle d finit les diff rents accesseurs et mo dificateur de la classe Mauhly Cette partie est quasiment automatiquement d riv e de la description de l tat de la classe public void play bouge random nextInt this ON La m thode play permet de faire jouer le monstre Ici le monstre bouge dans une direc tion au hasard Nous aurions pu coder une strat gie plus labor e en tenant de la position des autres monstres et de l tat physique du monstre courant Mais cette strat gie est suffisante pour ce que nous voulons montrer private void bouge int direction int x getRegion getX int y getRegion getY switch direction case NORD y break case NE x y break case EST x break case ES x y break case SUD y break case SO x y break case OUEST x break case ON x y break default System err printin Mauvaise direction _ direction x y repr sente maintenant les coordonn es de la region arriv e Region regionCible this getRegion getCarte getRegion x y if regionCible null return if regionCible getMauhly null this setRegion regionCible regionCible setMauhly this else combattre regionCible getMauhly 80 Classes et objets La m thode bouge est le coeur du compertement des monstres Elle commence par d te
189. out regions length regions 1 length for int i 0 i lt regions length i for int j 0 j lt regions i length j this add new JLabel Case i j 9 5 Principe du MVC 181 9 5 Principe du MVC Le mod le par d l gation permet de propager les v nements vers les classes applica tives Les objets receptionnant les v nements provoquent les changements d tat du mod le Ces objets recepteurs en controlent en quelque sorte les changements d tat sur le mod le On appelle ces objets les controleurs Le probl me est maintenant le suivant quand le mod le change d tat comment propager le nouvel tat vers les composants graphiques qui visualisent le mod le Nous avons construit une nouvelle version du visualisateur d tat du h ros bas e sur le MVC La figure 9 26 visualise ce nouvel cran La figure 9 27 montre ce m me cran apr s que le h ros se soit repos plusieurs fois et enlev son armure Figure 9 26 Un cran de visualisation bas e sur le MVC Arme Armure 2 Repos Enlever Arme Enlever Armure 18 25 orce 15 182 Le graphique Figure 9 27 Propagation des changements d tat du mod le vers les vues lo x Arme Armure 2 Arme 5 Repos Enlever Armure Cet cran est le r sultat de l instanciation du diagramme de classe de la figure 9 28 La figure 9 29 repr sente le diagramme d objets de cet cran
190. parfaitement d clarer pour cet exemple direc tement fab comme une r f rence d objet LeLor ia au lieu d une r f rence d objet impl mentant l interface FabriqueDeMonstres Figure 7 4 Utilisation simple d une fabrique import fr loria tortueJava moteur Monstre import fr loria tortueJava moteur FabriqueDeMonstres import fr loria tortueJava config LeLoria class TestFabriquel public static void main String args FabriqueDeMonstres fab new LeLoria for int i 0 i lt 10 i System out println fab fabriquerUnMonstre Modifions cet exemple pour que le lien vers la fabrique concr te ne soit plus fait direc tement dans le code et donc par le compilateur mais plut t l ex cution Ceci est fait sur lexemple de la figure Le mot FQN de la classe la fabrique concr te de monstres est pass e en param tre a l ex cution du programme java TestFabrique2 fr loria tortueJava configl LeLoria Ce param tre est r cup r dans le programme via la cha ne de caract re args 0 cf 3 3 La m thode statique forName de la classe Class du package pr d fini java lang permet de charger dynamiquement une classe partir de son FQN pr cis sous forme d une chaine de caract res Le r sultat de ce chargement est un objet de la classe Class qui re pr sente la classe d sir e l ex cution Cette instance de la classe Class construit des ins tances de la classe quelle rep
191. pe un package Dans le cas du jeu les tortues java crit par les auteurs tous membres du loria domaine loria fr on peut choisir comme nom racine pour les packages du jeu fr loria tortuesJava Ainsi toute classe C d finies dans le jeu et plac es dans un sous package sub de fr loria tortueJava aura un nom unique son fully qualified name FQN fr loria tortueJava sub C L usage veut qu un nom de package ou sous package commence par une minuscule et qu un nom de classe ou interface commence par une majuscule Les biblioth ques de base de java respectent ces conventions Bien entendu dans un m me package les classes ou interfaces doivent avoir des parties droites de FQN noms simples diff rents Pour pouvoir utiliser les classes ou interfaces d un autre package dans un fichier java unit de compilation afin de r aliser des sous classements implementations d interface typages d une variable ou d un param tre instanciations on peut utiliser le FQN d une classe partout o nous avons utilis un simple nom jusqu pr sent Si on fait un usage intensif de classes de plusieurs packages au nom un peu long le pa ckage de I interface graphique java awt par exemple utiliser des FQN partout peut s av rer tr s lourd On peut alors utiliser en d but de fichier apr s l ventuelle clause package une ou plusieurs clauses import Cette clause import a deux variantes 1 import lt fully qualified nam
192. pl add new JLabel vie m getVie pl add new JLabel Force m getForce JPanel p2 new JPanel p2 setBackground Color yellow p2 add new JLabel Arme m getArme p2 add new JLabel Armure m getArmure JPanel p3 new JPanel p3 setBackground Color green JList 1 new JList m getEquip p3 add 1 1 aggr gation des diff rents panel f getContentPane add p1 f getContentPane add p2 f getContentPane add p3 Arbre pr t Affichage f pack f setVisible true D un point de vue conceptuel les diff rences sont mineures Sur cette application les rendu graphique est quasiment identique La diff rence entre les deux librairies est d ordre architectural La librairie AWT se base sur la librairie graphique du syst me h te Sur win dows si je cr e un bouton java la JVM va demander la librairie graphique de windows de cr er un bouton windows La JVM se charge par la suite de g rer le mapping entre l objet Java et l objet graphique windows Cette approche a l avantage de d l guer l affichage et le rendu des composants graphiques au syst me h te La m me application va cr er des bou tons windows si elle est execut e sur windows et des boutons MacOS si elle est execut e sur MacOS La librairie swing ne d l gue pas le rendu graphique des composants au syst me h te Elle g re elle m me comment une liste ou un label est dessin Elle demande
193. public void porter Maintenant Joueur j int en this porteur j this emplacement en Il faut bien noter que les ajouts faits dans la classe Arme devront tre r p t s dans la classe Protection ou Sac si on d cide qu elles doivent aussi tre portables Il faut entre autre que le sac puisse tre port sur le dos 6 5 Interface h ritage ambiguit 117 6 5 Interface h ritage ambigu t 6 5 1 H ritage mutiple des interfaces Il est parfaitement possible de d finir des hi rarchies d interfaces L h ritage multiple est disponible entre interfaces le mot clef extends peut tre suivi de plusieurs noms d inter face s par s par des virgules lors de la d finition d une interface De m me une classe peut impl menter plus d une interface le mot clef implements peut tre suivi de plusieurs noms d interface s par s par des virgules Finalement classes et interfaces forment un graphe orient entre les relations d h ritage ou d implementation r alisation On pourrait donc argumenter que finalement on dispose de l h ritage multiple en java Ceci n est pas r aliste en tout tat de cause le code les m thodes que poss de une classe provient uniquement d elle m me ou des super classes de Parbre d h ritage form par les relations d h ritage simple La structure concr te des objets est construite par h ritage simple Il n y pas de r elle solution bas e sur l h ritage multiple
194. r PILE T fonctions d acc s vide PILE T BOOLEEN La pile est elle vide sommet PILE T 1 Consulter le sommet de la pile fonctions de transformation empiler PILE T x PILE T d piler PILE T gt PILE T Pr conditions V p PILE T d piler p est d fini ssi non vide p sommet p est d fini ssi non vide p Axiomes V t T p PILE T vide cr er VRAI Propri t s vide empiler p t FAUX de la fonction vide sommet empiler p t Principe d piler empiler p t dernier entr premier sorti FIG 1 1 Description simplifi e d une pile l aide d un un type abstrait de donn es d apr s PD le principe de gestion d une pile dernier entr premier sorti un nouvel l ment se place au sommet de la pile et empiler un nouvel l ment puis le d piler donne la pile initiale Faute de ces contraintes la description propos e englo berait aussi des structures comme les listes ou les files Cette approche conduit une m thode de conception de logiciel organisant chaque module autour d une famille de structures de donn es dont la description est celle d un type abstrait de donn es C est un point de vue op rationnel qui est en confor mit avec les principes d abstraction de donn es et de masquage d information Un module ne s occupe que de ses propres affaires et ses clients n en ont q
195. r sente lorsqu on invoque sa m thode newInstance Nous avons encha n le chargement de la classe pass e en param tre et la cr ation d une de ses ins tances dans une seule expression ligne 6 La m thode newInstance a un r sultat typer en Object car en effet c est l unique classe qui puisse contenir n importe quelle instance de n importe quelle classe Dans notre cas nous pouvons tre plus pr cis la classe consid r e doit impl menter l interface FabriqueDeMonstre nous for ons donc par transtypage cast l affectation de cette instance dans la variable fab r f rencant des objets impl mantant l interface FabriqueDeMonstre Si le param tre donn l appel de notre programme n est pas un FQN d une classe acc ssible ou qui n impl mente pas FabriqueDeMonstre un certain nombre d exceptions peuvent survenir telles ClassNotFoundException ou CastException 7 5 Stockage des package CLASSPATH et autres d tails 139 Une fois fab affect e par un objet correct le code reste le m me que dans l exemple pr c dent On voit donc qu il est bien inutile de vouloir trop sp cialiser le type de la r f rence fab Une discussion similaire peut tre tenue pour les r f rences acc dant aux monstres cr s les typ es en Monstre suffit et de toute fa on dans le cas du chargement dynamique de la classe de la fabrique d objet il est impossible de connaitre a priori les classes concr tes des monstres
196. r objet D abord il faut se rendre compte que Si main ne garde pas de r f rence sur le nouvel objet il lui sera impossible par la suite de le d signer En effet l identit 40 Classes et objets 62 d finition d une variable lo cale Il s agit ici d un r f rence class Mauhly sur un objet de classe Mauhly private String nom La port e de cette r f rence est private int force limit au corps de la m thode gt Private int vie i private int exp 0 main ise D new cr e v ritablement un public int getForce return force objet de classe Mauh1 y public int getExp return exp 6S Voici un appel de m thode gt public int getVie return vie Private void setVie int viep vie viep ou encore un envoi de message US public void reposer L objet r f renc par la variable setVie getVie 10 momo est appel le receveur la a m thode reposer est appel sur l objet receveur class Main a a public static void main String args System out println Mauhly momo new Mauhly permet d imprimer le param tre System out printin momo getVie effectif sur la sortie standard N gt momo reposer Ce param tre doit tre de classe gt System out printIn momo getVie String FIG 3 8 Instanciation bar exl 55 cd exl bar ex1 5 javac java bar ex1 57 java Main 0 10 bar ex1
197. rchives permettent de distribuer plus facilement et plus rapidement les bi blioth ques et acc l rent la recherche des fichiers de classes Leurs chemins d acc s peuvent tre indiqu s directement dans la variable CLASSPATH D une mani re g n rale c est le programmeur qui fixe lui m me la valeur de la variable CLASSPATH en fonction des r pertoires o sont stock s les fichiers de code compil de ses ap plications Dans notre exemple la variable pourrait prendre la valeur donn e la figure 1 4 Figure 1 4 Fixer la valeur de la variable d environnement CLASSPATH setenv CLASSPATH Java Livre Classes et objets compile exemple1 cd java Hello hello world La machine recherche donc d abord le fichier He 1lo class dans le r pertoire courant dont il ne fait pas partie puis dans le r pertoire Java Livre Classes et objets comp du r pertoire courant o elle le trouve Il est alors charg et ex cut Pour finir notez que la variable CLASSPATH n est pas seulement utilis e au mo ment du lancement de l ex cution d un programme mais galement au cours m me 1 3 Ex cuter un programme 19 de l ex cution En effet la machine virtuelle Java est capable de charger dynamique ment les classes dont elle a besoin au fur et mesure qu elle ex cute un programme et de continuer l ex cution par le code nouvellement charg Nous y reviendrons 20 La conception de logiciel
198. re deux r f rences porte sur la r f rence elle m me Si les deux r f rences a b r f rencent le m me objet alors a b est vrai sinon a b 7 Ane pas confondre avec a b l affectation 64 Classes et objets class Mauhly A sou private String nom private int force private int vie class Arme private int exp 10 private int destr 0 public Arme int destr private Arme arme null this setDestr destr private Armure armure null M copy constructeur mieux crit du point de public Mauhly Mauhly m vue de l encapsulation nom m nom public Arme Arme a force m force this setDestr a getDestr vie m vie exp m exp arme new Arme m arme MH ives armure new Armure m armure FIG 3 42 Copy constructeur copie profonde la pile d appel le tas d objets m1 Maulhy nom affreux al Arme destr 5 bl Armure prot 6 Point de Vie 100 Exp rience 0 Force 10 Tommi H combattre TR TEPS m2 Maulhy nom affreux Point de Vie 100 Exp rience 0 Force 10 a2 Arme destr 5 b2 Armure prot 6 FIG 3 43 graphe d objets apr s copies profondes 3 6 R f rences class Main public static void main String args Mauhly ml new Mauhly affreux 15 25 Mauhly m2 new Mauhly affreux 15 25 System out printin ml m2 false ml m System out printin ml m2 true Fic 3 44
199. re une classe consommatrice de d v nements de type cla vier sourris fen tre Nous cr ons trois composants graphiques une fen tre un bouton une champ texte et nous d clarons les diffusion d v nements de la mani re suivante La fen tre s abonne aux v nements de type souris fen tre et clavier Le bouton et le champ texte s abonne aux v nements de type action bouton appuy ou modification de texte valid e La figure 9 14 montre le rendu graphique du programme Nous montrons Ci dessous le texte imprim e sur la sortie standard Received event java awt event WindowEvent WINDOW_ACTIVATED on frame0 Received event java awt event FocusEvent FOCUS_GAINED permanent on javax swing JButton 10 5 75x27 Received event java awt event WindowEventtWINDOW_OPENED on frame0 Received event java awt event MouseEventt MOUSE_MOVED 64 64 mods 0 clickCount 0 on frameO Received event java awt event KeyEvent KEY_PRESSED keyCode 18 keyChar modifi ers Alt on frame0 166 Le graphique Received event java awt event KeyEvent KEY_RELEASED keyCode 154 Print Screen mod ifiers Alt on frame0 Received event java awt event KeyEvent KEY_RELEASED keyCode 18 keyChar on f rame0 Figure 9 14 Un exemple simple import java util import javax swing import java awt import java awt event class EventCatcher implements ActionListener WindowListener
200. res aux protections coefProtection La classe ainsi obtenue est pr sent e sur la figure Fig 4 5 Figure 4 5 Surcharge de print dans la classeProtection sous classe d Equipement public class Protection extends Equipement int coefProtection int getCoefProtection return coefProtection void setCoefProtection int coef this coefProtection coef void print System out println Protection masse getMasse valeur getValeur coefficient de protection getCoefProtection Cette fois c est la m thode print ainsi d finie qui sera appel e pour tout instance 86 L h ritage Equipement masse 0 valeur 0 Protection masse 0 valeur 0 coefficient de protection 0 Protection masse 0 valeur 0 coefficient de protection 0 Protection masse 0 valeur 0 coefficient de protection 0 FIG 4 2 Ex cution de l exemple de la figure 4 6 de Protection ou d une de ses sous classes Notons que nous nous effor ons de toujours utiliser les accesseurs m me lorsque nous surchargeons une m thode Le m canisme impliqu dans le choix de ma m thode ex cuter s appelle liaison dyna mique Pourquoi un tel non Souvent la m thode exacte appeler pour une instance rep r e par une r f rence ne peut pas tre d finie lors de la compilation mais seulement l ex cution lorsque l on est s r du type dynamique de l instance d objet consid r Sch matique
201. rivate int y relation Carte Mauhly 0 1 dans ce sens private Mauhly mauhly null public Region Carte carte int x int y this carte carte this x x this y y public Carte getCarte return carte public int getX return x public int getYO return y public void setMauhly Mauhly mauhly this mauhly mauhly this setChanged this notifyObservers public Mauhly getMauhly return mauhly public Component display Component c new IHM this addObserver Observer c return c class IHM extends Canvas implements Observer private final Image herbeimg Toolkit getDefaultToolkit getImage images herbe gif public IHMO update Region this null public void update java util Observable 0 Object arg this repaint 196 Le graphique Annexe A Lexique Java 198 Lexique Java Annexe B Elements de syntaxe Java 200 Elements de syntaxe Java Annexe C UML
202. rminer en fonction d une direction la r gion d arriv e du monstre regionCible La d fi nition des constantes est ici payante car elle permet une bonne lisibilit du code Remplacez les constantes par 0 1 7 et le code devient beaucoup plus difficile a suivre La ligne 64 montre bien comment il est possible de naviger dans le graphe d objet condition d avoir bien con u son programme Ici nous montrons bien comment nous re montons partir de l instance courrante sur la r gion et sur la carte pour finir par trouver la r gion cible Cette r gion peut ne pas exister auquel cas le monstre reste juste ou il est et son tour est pass La ligne 70 teste si la r gion cible contient un monstre Si ce n est pas le cas le monstre de d place sur la r gion cible et lib re sa r gion d origine Il suffit de mettre jour la relation Mauhly Region pour r aliser cette op ration Si la r gion cible contient un monstre alors il faut combattre le monstre ne se d place pas dans ce cas private void combattre Mauhly ennemi ennemi set Vie ennemi getVie this force System out printin this nom _inflige_ this force pts de degat a ennemi nom La m thode de combat est tr s simple Elle peut tre d clar e private car elle ne fait partie de l interface de la classe Dans le corps de cette m thode this frappe et ennemi re oit et donc perd de la vie Il faut remarquer que nous passons bien p
203. rmure p2 add jarme new JButton Arme m getArme p2 add jarmure new JButton Armure m getArmure panel pour visualiser le contenu du sac JPanel p3 new JPanel p3 setBackground Color green java awt List 1 new java awt List for Enumeration e m getEquip e hasMoreElements l add e nextElement ns p3 add aggr gation des diff rents panel f getContentPane add p1 f getContentPane add p2 f getContentPane add p3 Arbre pr t Affichage f pack f setVisible true 9 3 3 Gestion des dialogues Construire un dialogue consiste cr er des nouvelles fen tres dont l objectifs est d in former l utilisateur de poser une question l utilisateur ou de demander l utilisateur de saisir une variable ou un texte Deux caract ristiques essentielles diff rencient un fen tre de dialogue d une fen tre normale Une fen tre de dialogue ne peux exister sans une fen tre m re 176 Le graphique Une fen tre de dialogue est modale La modalit d un dialogue d finie si l utilisateur a la possibilit d int ragir avec les autres fen tres quand la fen tre de dialogue est affich e La modalit est donc une valeur bool ene Si le dialogue est modal alors l utilisateur ne peut int ragir qu avec la fen tre de dialogue Sinon l utilisateur peut int ragir avec toutes fen tres de application Nous avons ajou
204. roite null PortableEtJoueurVisitable porteEnMainGauche null PortableEtJoueurVisitable porteSurLeDos null int getMasse return masse public void accept JoueurVisitor v v visiter this if porteEnMainDroite null porteEnMainDroite accept v if porteEnMainGauche null porteEnMainGauche accept v if porteSurLeDos null porteSurLeDos accept v 124 Les interfaces Figure 6 8 Modification de la classe Equipement pour forcer l interface JoueurVisitor dans ses sous classes public abstract class Equipement implements JoueurVisitable int masse int valeur int getMasse return masse void setMasse int masse this masse masse int getValeur return valeur void setValeur int valeur this valeur valeur 6 7 Interfaces et pattern visitor 125 Figure 6 9 Une classe Sac pouvant tre visit e par un JoueurVisitor public class Sac extends Equipement implements PortableEtJoueurVisitable Joueur porteur int emplacement Portable NON_PORTE Equipement contient new Equipement 10 int cptEquipement 0 int masseAvide 1500 void add Equipement e if cptEquipement lt contient length contient cptEquipement e cptEquipement else exception void setValeur int valeur int getValeur int resultat 0 for int i 0 i lt cptEquipement i resultat contient i getValeur return resultat void setMasse int masse masse
205. rom constructor arc C 89 a out Autrement c est vraiment impossible en C Figure 5 5 Constructeurs et liaison dynamique public class A int a 10 AO System out printin getVal getVal a a int getVal return a public class B extends A int b 5 BO System out printin getVal getVal _b _ b int getVal return b public class Test public static void main String args B unB new BQ 112 La liaison dynamique 5 4 Conclusions Bon Java est peut tre moins obscur que C car il y moins de fioritures pas de pa ram tres par d faut nombres variables de param tres surcharges des op rateurs h ritage multiple et donc moins error prone pour le programmeur Mais il y toujours des m ca nismes d licats qui peuvent g n r s des erreurs compilation ou ex cution subtiles ou pire des effets tr s diff rents de ceux qu attend le programmeur 6 Les interfaces 114 Les interfaces 6 1 D finition Les interfaces sont une version r duites de d finition de classe forc ment abtraites pas de variable d instance pas de m thodes de classes statiques des variables forc ment de classe statiques et finales en d autres termes unique ment des d finitions de constantes des m thodes d instances forc ment abstraites des d finitions forc ment publiques On peut r sumer cela en disant qu une interface d fini
206. rs cf 4 3 4 il faut tout de m me noter que la liaison dynamique s applique pour les appels de m thodes d instance faits dans le code des constructeurs Ce n est pas le cas de C Ceci est tout fait homg ne et utile mais peut succiter quelques effets inattendus Notamment il est ainsi possible d acc der des variables d instances munies d expression d initialisation avant que celle ci aient t ex cut e C est pour cela que java d finit des valeurs par d faut selon leur type 0 pour les num riques null pour les r f rences y compris celles sur la classe String Reprenons dans la figure 5 5 l exemple illustrant l encha nement des appels des construc teurs vu la section 4 3 4 Nous l avons simplifi en supprimant un des constructeurs de B Par contre nous avons introduit une m thode d instance get Val d acc s aux variables d ins tance d finies dans A ou B Cette m thode est donc surcharg ee par h ritage dans la classe B ligne 14 La figure donne le r sultat de l ex cution de cet exemple La premi re ligne cor respondant l ex cution du constructeur de A en effet apr s remont e des constructeurs des super classes les appels effectifs se font du haut vers le bas cf 4 3 4 La premi re valeur affich e vaut 0 car c est le r sultat de l appel de get Val de B en effet le type dynamique de this est B ligne 19 Or lorsque que cette m thode est invoqu l expression d
207. rs 100 et 42 Toute fois pour des questions de simplicit et d efficacit entre autres les entiers Java sont consid r s comme des objets de type primitif qui ne sont pas soumis au prin cipe d encapsulation Ils sont manipul s la fa on d un langage de programmation n utilisant pas d objets C par exemple sans avoir besoin de recourir des m thodes Voici donc une repr sentation plus exacte de notre objet chainel conteu momo54 Point de Vie 100 massuel Exp rience 41 Coef Destruction 2 Force 18 ArmureAirun1 Arme Port e Coef Protection 2 Se Contenu Vide Toutefois dans un souci de simplification les chaines de caract res et les nombres seront d sormais repr sent s comme des attributs primitifs la mani re du second diagramme videmment le h ros n est pas le seul objet de l application En particulier il est tout instant associ une position sur la carte qui peut tre repr sent e de bien des fa ons par exemple un couple de coordonn es x y ou encore une r f rence 30 Classes et objets Fic 3 1 Les d placements possible du h ros partir de la case centrale un objet case Une case peut elle m me tre caract ris e par ses coordon es sur la carte le paysage qui lui est li e la pr sence ventuel d un personnage monstre ou h ros etc Nous venons ainsi de
208. rt coefficient parmi ceux dont il dispose 5 boire une potion Le jeu s arr te lorsque le h ros meurt ou lorsqu il quitte volontairement le jeu Un score est calcul en fonction de ses possessions cet instant de la fa on suivante DO 9 gt hp exp or valeur en ecu de ses possessions Le h ros est ensuite ins r dans le classement r pertoriant les 10 meilleurs scores r alis s par les utilisateurs de la version courante du jeu La partie graphique Vous avez libre choix pour r aliser le controle du h ros humain le clavier me semble un bon choix Un cran d aide doit pouvoir renseigner l utilisateur sur les moyens de faire bouger le h ros humain 2 2 Analyse 25 Si l utilisateur demande terminer et sans que le h ros humain soit mort alors il faut confirmer la fin du jeu Description du contenu du sac lorsque le h ro porte une arme 2 2 Analyse Nous avons r alis avec les tudiants de l Ecole Sup rieure d Informatique et d Application de Lorraine ESIAL l application Tortue Java conform ment au ca hier des charges Au cours de l analyse nous avons con u les diff rents crans dont nous aurons besoin La figure 2 2 est le premier cran que peut voir l utilisateur Il permet en utili sant les menus de lancer le jeu de voir les meileurs scores de quitter ou encore de consulter l aide relative ce jeu Figure 2 1 l cran de d marrage ey Tortue
209. rter les diff rents objets et armes ventuellement ramass s au cours du jeu Un sac peut contenir un autre sac ramass au cours du jeu Lor est caract ris e par une valeur en cus Il existe 3 type potions magiques Vie Gain ou pertes de points de vie Exp rience Gain ou pertes de points d exp rience Paralysie Paralysie momentan e du joueur sur un nombre de tour Les combats Lorsqu un acteur A porte un coup un autre acteur B les points de vie de B diminuent d une quantit calcul e en fonction des caract ristiques des deux acteurs de la fa on suivante B hp B hp A degat B prot A degat A force A arme destr B prot B armure prot B bouclier prot Lorsque la quantit de points de vie d un acteur devient n gative ou nulle acteur meurt et disparait du jeu Son sac ainsi que ses diff rentes armes armure bouclier arme tombent sur le sol o ils pourront tre ramass s par les autres acteurs Lorsqu un acteur A gagne un combat contre un acteur B ses points d exp riences augmentent de la moiti du nombre de points d exp rience de B Tous les 100 points d exp riences un acteur augmente ses caract ristiques de vie et de force de 10 pour cent 2 1 2 Le jeu La construction des cartes Il existe un nombre fix de cartes pr d finies comportant Des cases constituant des obstacles infranchissables les autres cases contenant de l herbe 24 Cahier des charges Tortu
210. s Le programme principal d une application graphique est le plus souvent construit sur le m me cannevas 1 Mise en place des crans Il s agit de mettre en place des arbres d objets graphiques Les objets graphiques sont des objets part enti res qui incluent un tat et la capacit d tre dessin Pour repr senter un tat de notre application tortues java il faudra donc cr er des objets graphiques et maintenir l tat des objets graphiques en accord avec l tat des objets applicatifs Cette distinction objet graphiques objets applicatifs est fondamantale et la mani re de g rer les relations entre ces deux types d objets est loin d tre triviale 2 Mise en place des callbacks Il s agit de mettre en place des r gles du type On Event Do action i e quand ce bouton est appuy alors ex cuter cette m thode avec ces param tres 3 Lancement de la boucle d v nements Un programme graphique passe le plus clair de son temps attendre des v nements g n ralements en provenance des objets gra phiques Quand un v nement arrive il faut examiner les desiderata du programmeur ses callbacks et ex cuter la m thodes ad quates avec les param tres ad quats Pour construire une interface graphique il faut donc tre capable de construire des arbres de composant graphiques d associer des actions aux v nements de g rer les relations objets applicatifs objets graphiques
211. s xsuivant ysuivant Sur la ligne de cet exemple nous voyons une utilisation de la classe d exception pr sent e dans l exemple 8 1 En effet apr s mise jour des coordonn es de la case cible du d placement le test pr c dent cette ligne d tecte quelles correspondent a une case ext rieure au plateau Nous cr ons donc une exception DeplacementHorsDuPlateauException sans message pr cis que nous communiquons imm diatement l environnement d ex cu tion Il faut bien noter que cette utilisation de l instruction throw provoque l arr t imm diat de la m thode calculerCaseSuivante Cette exception est une exception v rifi donc avons donc indiquer lors de la d claration de la m thode ligne 1 que celle ci est succeptible de la lever utilisation de la clause throws Une classe utilisatrice de cette m thode par exemple l interface permettant l utilisateur de d placer le joueur devra donc obligatoire ment prendre en compte cette exception dans le cas d interface graphique une indication de d placement incorrect serait d livr e l utilisateur Par contre la ligne donne un exemple d exception non v rifi e Nous avons simple ment lev e une Error si le param tre direction ne correspond aucun des cas attendus les constantes Nord NordOuest n ont pas t pr sent es sur l exemple Cette erreur n a pas tre sp cifi e dans la partie throws de la d claration de la m thode
212. s diff rentes classes concr tes visiter dans le type du param tres des m thodes visiter Une autre possibilit serait d utiliser des noms de m thodes diff rents pour chaque cas visiterJoueur Joueur visiterArme Arme En proc dant comme nous l avons fait nous pouvons tre tenter de d finir un comportement par d faut pour les quipements En fait rien n emp che de d finir une m thode accept JoueurVisitor dans la classe quipement La liaison dynamique toujours pr sente en java fera que cette m thode ne sera appel e sur un objet d une sous classe de Equipement que si aucune autre n est d finie dans l arbre d h ritage entre Equipement et le type dynamique Nous pouvons tre tenter de d finir une m thode accept dans la classe Equipement de la mani re suivante 1 public void accept JoueurVisitor v 2 v visiter this Dans l tat actuel des choses ce code ne compile pas il n y a pas de m thode visi tor Equipement dans la classe JoueurVisitor et le compilateur ne s lec tionnera en aucun cas une sous classes de Equipement comme type de param tre formel pour correspondre un param tre effectif type statique de cette classe Bref aucune m thode visiter ne peut tre s lectionn e Il faudrait ajouter dans l inter face JoueurVisitor une m thode visiter avec un param tre formel de type Equipement Mais cette pratique va un peu l encontre de l id e du pattern il y
213. s dynamiques de m thodes Il est tout fait justicieux que cette m thode soit d clar e comme final dans la classe Ob ject ainsi aucune 102 L h ritage classe qui d rive forc ment de la classe Object ne pourra surcharger getClass pour tenter de faire prendre ses instances pour ce qu elles ne sont pas 4 8 Questions Voici quelques questions pour voir si les diff rents concepts de ce chapitre ont t com pris 1 La classe Ob ject poss de t elle un constructeur sans param tres si oui pourquoi 2 Une m thode peut elle tre d clar e comme abtraite et priv e 3 Une classe peut elle tre d clar e final et abstract 4 Une m thode peut elle tre d clar e comme abstraite et finale 4 8 1 Petits exercices Q Ecrire une classe la plus simple possible La compiler Visualiser le contenu du class g n r l aide de javap Que dire R on critclasse A dans un fichier A java On compile javac A java javap A donne 1 class A extend java lang Object 2 A On observe donc bien Toute classe h rite de Object Un constructeur sans param tre est g n r par d faut 5 La liaison dynamique 104 La liaison dynamique Nous avons d ja voqu le m canisme de liaison dynamique cf 4 3 1 commun aux languages orient s objet Grossi rement une notation codeo m o o est une r f rence un objet dont le type statique d clar est C et m une m thode d instan
214. s le type statique de la variable a 4 3 Relation avec les l ments constituant une classe 89 A m B m A m B m B m A m A m FIG 4 4 Ex cution de l exemple de la figure 4 7 Figure 4 7 Exemple de masquage d une m thode de classe et utilisation class A public static void m System out printin A mQ class B extends A public static void m System out printin B m public static void test m public void test2 super m class Main public static void main String args A a new A B b new BO A m B m a m b m b test b test2 a b permutation a m Le masquage est un comportement fonci rement diff rent de la liaison dynamique mais peu comparable puisqu il ne concerne pas les instances 90 L h ritage 4 3 3 H ritage et attributs Pour les attributs variables de classe ou d instance c est un m canisme de masquage similaire celui des m thodes de classe cf 4 3 2 qui s applique Il faut bien noter que dans les deux cas variables de classe et variables d instance la s lection de l attribut utiliser se fait de mani re statique la compilation 4 3 4 H ritage et constructeurs Nous avons vu que l tat initial d une instance est d fini lors de l appel d un constructeur Les constructeurs peuvent tre d finis pour chaque classe qu elle soit sous classe d une au
215. s lors de l analyse et les interfaces sont toutes indiqu es pour introduire des concepts plut t li s la conception implementation Sur notre exemple le joueur est une structure d objets lui m me et les quipements qu ils portent diff rents endroits mains et dos Le calcul implanter l aide de ce pattern peut tre la masse totale du joueur qui peut tre utile si on introduit des r gles concernant l nergie consomm e par le joueur La correspondance entre les participants du pattern et les classes de notre exemple est donn e dans la table 6 1 Nous n avons pas tenu compte des autres sous classes de Equipement d j introduites pour simplifier l exemple La classe JoueurVisitor est d finie comme une classe purement abstraite qui liste les m thodes de calcul implanter pour chacune des ConcreteElement Son code est donn dans la figure Nous avons fait le choix d une classe plut t que d ue interface car bien qu une telle d finition soit du domaine de la conception implementation il n y a pas de raison pour qu un objet appartenant une autre hi rarchie doive aussi tre un JoueurVisitor C est une classe purement technique qui doit tre utilis e uniquement par d rivation 6 7 Interfaces et pattern visitor 121 Figure 6 4 Un visiteur abstrait pour la classe Joueur public abstract class JoueurVisitor public abstract void visiter Joueur j public abstract void visiter Arm
216. s ne viennent en fait que d un respect plus grand du principe d encapsulation Nous utiliserons assez souvent dans ce livre une repr sentation diagrammatique des classes Cette repr sention est conforme la norme UML Cette repr sentation est g n ralement utilis e dans les phases d analyse et de conception d un logiciel Elle permet entre autre de donner une vue synth tique de l organisation statique et dynamique d un logiciel favorisant ainsi la compr hension g n rale La classe Mauh1y est repr sent e dans la figure La figure 3 6 est un diagramme de classe montrant la classe Mauh 1 y On observe sur cette figure la diff rence entre type primitif et objet Les types primitifs entier r ls bool an caract res ne sont pas des objets en Java Il n ont donc pas de classes d finissant leurs tats et comportement Ils apparaissent comme des attributs simple en UML Par contre en Java St ring est une classe donc la variable d instance nom est en fait une r f rence sur un objet de classe St ring Mais je n ai pas personnel lement d finit la classe St ring Elle est en fait d finie dans la biblioth que Java Comme cette biblioth que est tr s grande les classes sont rang es dans des sortes 38 Classes et objets definition de la classe Maulhy el private int force String from lang rivate int vie public int getForce return force Mauhly public int getExp orce int
217. s t ches moins complexes jusqu obtenir des traitements suffisamment simples pour qu ils puissent tre directement implant s dans le langage choisi La m thode revient d velopper un arbre de t ches o le niveau d abstraction des t ches va d croissant de la racine vers les feuilles Ce genre de m thode a l avantage de fournir au programmeur un bon guide pour amorcer la conception de son syst me logiciel Elle est relativement facile ap prendre et appliquer car elle fait appel un raisonnement logique que chacun sait 6 La conception de logiciel utiliser naturellement Elle ne favorise cependant pas certaines des qualit s impor tantes mises en exergue pr c demment telles que la r utilisabilit et l extensibilit Les modules trouv s ne sont naturellement pas g n raux mais adapt s aux sous probl mes pour lesquels ils ont t conc us dans la structure d arbre obtenue un fils pourvoit un des besoins sp cifiques de son p re La d marche descendante ne favorise donc pas la production d l ments r utili sables qui sont plut t obtenus par composition de modules existants c est dire par conception ascendante Un programme est le plus souvent destin subir de nombreuses modifica tions tout au long de son exploitation Par exemple un logiciel conc u l ori gine pour diter des feuilles de paye mensuelles sera ensuite modifi pour pro duire galement les feuill
218. sJava fees oat es E File Help Si l utilisateur choisit de jouer alors le programme lui demande son nom au tra vers de l cran de la figure 2 2 26 Cahier des charges Tortues Java Figure 2 2 l cran pour demander le nom du joueur Nom du joueur x Mom du joueur I Un fois saisit le nom du joueur le jeu d marre v ritablement avec le maise en place de l cran de jeu de la figure2 2 Figure 2 3 l cran de jeu proprement dit 2 lolx File Help Passer Porte Conform ment au cahier des charges sur cet cran nous pouvons apercevoir les diff rents l ments associ s au jeu 3 Classes et objets 28 Classes et objets Ce premier chapitre d crit 3 1 Objets et r f rences Un objet est caract ris par Une identit qui assure son unicit Un fat repr sent un instant donn par les valeurs des attributs qui le ca ract risent Un comportement constitu par l ensemble des actions d finies par des m thodes permettant de consulter et modifier l tat de l objet Ces m thodes re pr sentent a priori le seul moyen de manipuler l tat de l objet c est le prin cipe d encapsulation dont nous avons parl dans le chapitre pr c dent 3 1 1 L tat d un objet Consid rons par exemple le h ros des Tortues Java Son tat du moment est suppos tre le suivant C est la machine virtuelle Java qui cr e t
219. se est donn e sur la figure 7 2 o on voit l utilisation d une clause import permettant d utiliser la classe TabDyn avec juste la derni re partie de son FQN 134 Les packages Figure 7 1 Exemple de classe plac e dans un package package fr loria tortueJava util public class TabDyn public TabDyn int taillelnitiale int tailleIncrement this elements new Object taillelnitiale this tailleIncrement tailleIncrement public TabDyn int tailleInitiale this tailleInitiale 10 public TabDyn this 10 10 public Object get int idx return elements idx public void set int idx Object obj if idx gt length Object ancienElements this elements elements new Object idx tailleIncrement 1 tailleIncrement System arraycopy ancienElements 0 elements 0 ancienElements length elements idx obj public int length return elements length private Object elements private int tailleIncrement Figure 7 2 Exemple d utilisation d une classe plac e dans un package import fr loria tortueJava util TabDyn class TestTabDyn public static void main String args TabDyn t new TabDyn 1 1 for int i 0 i lt 10000 i t set i new Integer i System out printin t get i 7 4 2 Groupements de classes et factory Nous allons traiter un deuxi me exemple plus sophistiqu qui est met en ceuvre le pattern abstract factory 7
220. sse m qui masque celle de A et affiche B m B poss de une m thode de classe test lignes 10 11 qui fait un appel simple m Elle poss de aussi une m thode d instance test 2 lignes 13 15 qui appelle la m thode m via la r f rence super Passons au programme de la classe Main une instance de A r f renc e par une variable de type statique A est cr e en ligne 19 La m me chose est faite la ligne 20 pour une instance de B et une variable de type statique B La ligne 21 invoque explicitement la m thode m de A ligne 1 de la figure 4 4 La ligne 22 invoque explicitement celle de B ligne 2 de la figure 4 4 La ligne 23 invoque la m thode m de A ligne 3 de la figure 4 4 car le type statique de la variable a est A Par contre c est celle de B qui est acc d e en ligne 24 ligne 4 de la figure 4 4 pour des raisons similaires La ligne 25 appelle en fait la m thode m de B puisque la m thode test appartient bien au code de B et donc la notation m utilis e en ligne 11 acc de la m thode de B masquant celle de A Ce n est plus le cas de la ligne 26 car la m thode test 2 utilise la r f rence super ligne 14 qui a finalement comme type statique A On constate que la derni re ligne de l ex cution du programme correspond un appel la m thode m de A car la ligne 28 du programme de test est syntaxiquement la m me que la ligne 23 et donc l affection de la ligne 27 n a aucune influence puisqu elle ne change pa
221. ssique et ne pose aucune difficult Il faut toutefois remarquer comment le constructeur de cette classe maintient une r f rence sur objet carte Ce comportement du constructeur est 14 pour repr senter la relation Carte Region une carte est form e de n x m regions une r gion appartient une carte La relation de carte vers region est implant e un tableau car elle est multi evalu e La relation inverse est juste repr sent e par une r f rence classique Toutefois comme la cardinalit de la relation inverse est de 1 i e toute r gion est situ e dans une carte cela signifie qu un objet r gion ne peut exister sans un objet carte Donc pour construire une r gion il faut une carte Donc forc ment le constructeur de Region doit prendre une r f rence sur un objet carte en param tre La figure 3 63 montre comment nous avons r ellement implant le diagramme logique de la figure 76 Classes et objets class Region relation inverse de la Carte Region 1 1 private Carte carte private int x private int y relation Carte Mauhly 0 1 dans ce sens private Mauhly mauhly null public Region Carte carte int x int y this carte carte this x x this y y public Carte getCarte return carte public int getX return x public int getYO return y public void setMauhly Mauhly mauhly this mauhly mauhly public Mauhly getMauhly return mauhly
222. t la pratique en compilant puis ex cutant le c l brissime programme hello world qui comme l indique son nom ne fait qu imprimer cette simple phrase hello world Nous sommes suppos s travailler et ceci restera vrai pour toute la suite sur une station Sun sous le syst me d exploitation UNIX Le caract re d invite de l interpr teur de commandes le shell UNIX est un 3 1 Le code source est saisi sous la forme d un ensemble de fichiers contenant les d finitions des classes n cessaires l implantation du programme UNE CLASSE PAR FICHIER Le nom d un tel fichier doit comporter l extension java Voici donc le contenu du fichier Hello java correspondant notre programme 2 Chaque fichier est ensuite compil pour produire le code ex cutable conforme la sp cification du langage d assemblage d fini pour la machine virtuelle Le compilateur livr avec le kit de d veloppement Java d une station de travail Sun s appelle javac javac Hello java 1 3 Ex cuter un programme 15 3 La compilation d un unique fichier source produit autant de fichiers d exten sion class qu il y a de classes d finies dans le fichier source Chacun de ces fichiers r sultats porte le nom de la classe correspondante et non pas celui du fichier source Le code qu il contient est sous forme num rique mais il peut tre examin sous une forme plus lisible pour qui connait le langage de la
223. t deux dialogue notre cran de visualisation de l tat du h ro Avant de quitter l application demande une configuration et le menu help about donne des infor mations propos de application La figure 9 23 repr sente ces dialogues Figure 9 23 Dialogues w E H 1 Quit 2 x Ei Tortues Java voulez vous vraiment sortir Tortues JAVA MARS 2001 import java util import javax swing import java awt import java awt event class Quit implements ActionListener public void actionPerformed ActionEvent e System exit 0 class CloseWindow implements ActionListener public void actionPerformed ActionEvent e Window w Window JComponent e getSource getTopLevelAncestor w setVisible false class QuitDialog implements ActionListener private JDialog jd QuitDialog JFrame f jd new JDialog f Quit true jd getContentPane setLayout new BorderLayout jd getContentPane add BorderLayout CENTER new JLabel Voulez vous vraiment sortir JButton oui new JButton oui JButton non new JButton non oui addActionListener new Quit non addActionListener new CloseWindow JPanel jp new JPanel jp add oui 9 3 G rer les v nements le mod le par d l gation jp add non jd getContentPane add BorderLayout SOUTH jp jd pack public void actionPerformed ActionEvent e jd setVisible true
224. t d tablir de prime abord les bonnes familles d objets est difficile Il est certain que l exp rience du concepteur joue un r le important en la mati re D crire les objets il ne s agit pas de d crire un objet mais une famille d ob jets c est dire une famille de structures de donn es qui ont des propri t s communes et dont l objet est un repr sentant La description d une famille ne peut tre ax e sur l implantation physique de ses objets Ainsi une pile ne doit pas tre vue comme par exemple un tableau avec une capacit et un indice d signant le sommet de la pile Une telle description manque par trop d abstrac tion et de souplesse puisque la repr sentation physique est susceptible d tre modifi e au cours de l volution du logiciel La solution ce dernier probl me est apport e par les types abstraits de donn es 1 qui permettent de d crire des familles de structures de donn es en termes de services d op rations offerts aux clients et de propri t s de ces services La figure 1 1 montre comment une pile pourrait tre d crite l aide d un formalisme de type abstrait La rubrique Type introduit le type qui est ici g n rique T est un param tre formel qui une fois instanci permet d obtenir un type de pile effectif par exemple une pile d entiers PILE ENTIER Nul besoin donc d crire des descriptions s par es et quasiment identiques p
225. t de la machine virtuelle cf figure 3 le r sultat de l ex cution de new Mauhly est une r f rence sur l objet nouvellement cr Comme affectation ver momo n est pas encore r alis e la r f rence momo reste nul1 4 On r alise maintenant l affectation Mauhly momo new Maulhy ce qui a pour effet de mettre jour la r f rence momo cf figure 5 5 nous continuons l ex cution sur jusqu la troisi me ligne L ex cution de System out println momo getVie a pour effet d afficher 0 la valeur initiale de notre objet nouvellement cr public static void main String args Mauhly momo new Mauhly System out printin momo getVie System out printin momo getVie L objet r f renc par momo recoit le message reposer Il faut donc empiler la m thode reposer cf figure 6 Le code a ex cuter est maintenant le suivant class Mauhly ie public int getVie return vie private void setVie int viep 48 Classes et objets la pile d appel le tas d objets Maulhy1 Mauhly momo Point de Vie 0 Exp rience 0 Force 0 FIG 3 16 Mauhly momo new Maulhy la pile d appel le tas d objets get Vie es oe A Point de Vie 0 a Exp rience 0 Force 0 FIG 3 17 Mauhly momo new Maulhy vie viep public void reposer setVie getVie 10 Il faut commencer par valuer la partie entre les
226. te int force 0 private java lang String nom null main 3 down main 2 down main 1l cont 0 10 Current thread main died Execution continuing 1 et aussi v rifier le serieux des relecteurs 46 Classes et objets la pile d appel le tas d objets Trom T args FIG 3 13 public static void main gt Main exited Quand la fin de la m thode main est atteinte le programme est termin et la machine virtuelle java s arr te Je vous engage faire cette manipulation vous m me sur votre machine m me si jdb est un d bogueur un peu rustre il est suffisant pour d boguer des petits programmes exemples Pour de plus amples exmplication sur le fonctionnement du d bogueur je vous renvoie a la documentation fournie avec le jdk section tools Nous pouvons maintenant ex cuter notre programme au pas pas en utilisant cette visualisation graphique de la pile et dus tas Vous pouvez faire exactement la m me chose sur votre machine en utilisant un d bogueur et v rifier que notre repr sentation graphique des choses est correcte 1 L utilisateur lance la machine java La pile et le tas sont vide pour I instant 2 L ex cution d marre sur la m thode main Donc la m thode main avec son contexte d ex cution est empil e dans la pile cf figure 2 Il faut noter que dans cet tat la variable momo est non initialis e elle est donc pour l instant null 3 On ex c
227. tre ou pas en fait nous verrons que de toute fa on une classe est au moins sous classe de la classe Object Les constructeurs bien que proche des m thodes d instances ne s h ritent pas Par contre l ex cution il y a un sh ma strict d appel des constructeurs disponibles le long de l arbre d h ritage L arbre d h ritage est d abord remont jusqu la classe Ob ject puis les constructeurs appel s en commen ant par celui de Ob ject C est donc une succession d appel de la ra cine de l arbre d h ritage vers la feuille qu est par exemple la classe indiqu e sur un new construction du haut vers le bas Dans sur la premi re ligne d un constructeur et seulement l on peut utiliser le nom de m thode pr d finie super Cet appel selon le type des param tres effectifs permet de s lectionner l appel d un constructeur de la super classe imm diate Si la premi re ligne d un constructeur n est ni un appel this et ni un appel super le compilateur introduit implicitement sur la premi re ligne un appel super appel au constructeur sans param tre de la super classe Consid rons la hi rarchie de classes et le programme de test de la figure 4 8 4 3 Relation avec les l ments constituant une classe 91 Figure 4 8 H ritage et constructeurs class Al int a 10 AIO System out printin CODE 2 a a class B extends Al int b 5 BO System out pr
228. ture sera conserv e dans le code Le crit re utilis est que les types para m tres de param tres formels soient les plus proches de ceux des expressions utilis es comme param tres effectifs La sp cification du langage parle de sp cificit d une d claration Une d claration de m thode provenant d une classe ou interface C1 est dite plus sp cifique qu une autre provenant d une classe ou interface C2 si et seulement si C1 peut tre convertie au sens de la conver sion utilis au point pr c dent et si chaque type de param tre de la m thode applicable provenant de C1 peut tre converti m me convertion que pr c dem ment en le type du param tre de m me rang de la m thode provennant de C2 Cette relation de sp cificit est une relation d ordre partielle entre d clarations de m thodes Si le compilateur ne peut pas trouver une d claration minimun au sens de cette relation une erreur de compilation est g n r e l invocation de m thode est ambigue Il faut bien noter que le type du r sultat de la m thode n est pas pris en compte dans cette tape La m thode est s lectionn e ind pendamment du type de son r sultat des erreurs de compilations li es un probl me de typage du r sultat de l invocation dans l expression qui l englobe peuvent donc se produire Nous verrons une exemple dans la section suivante 3 V rification que la m thode choisie est appropri e Nous nous som
229. u l tat virtuel dans la machine h te La m me technique peut tre utilis e pour par exemple faire fonctionner des programes pr vus pour l environnement Windows sur un ordinateur Macintosh En ce qui concerne la machine virtuelle Java il y a juste une petite diff rence elle mule une machine qui n a jamais t construite et qui n existe que sous la forme d une sp cification sur papier la machine en question m ritant pleinement son quali ficatif de virtuelle cette fois La sp cification qui d crit le langage d assemblage et l architecture g n rale de cette machine virtuelle a t mise la disposition du public N importe quelle personne suffisamment comp tente peut ainsi crire un programme simulant la machine virtuelle sur une machine r elle comme un Macin tosh mais aussi sur des supports plus surprenants comme un syst me embarqu dans une voiture un PalmPilot un t l phone portable voire pourquoi pas une machine laver une cha ne hi fi etc Cette approche n est pas r cente puisqu elle a d j t utilis e pour le syst me Smalltalk dans les ann es 1970 ou l interpr te Le Lisp dans les ann es 1980 Le 14 La conception de logiciel pcode du langage Pascal rel ve aussi du m me genre d id e Il est tout a fait pos sible de r aliser une machine virtuelle et l exp rience a d ailleurs t tent e plu sieurs fois pour Java en construisant une v
230. u une vision externe ils n acc dent aux donn es du module qu travers un ensemble de services d ment r pertori s et non pas sur la base d une implantation fix e un moment particulier de l volution du logiciel Ce point de vue est le seul compatible avec le d veloppement intensif de logiciel puisqu il permet de pr server I int grit de chaque composant du logiciel dans un contexte de changements fr quents L architecture du logiciel est fond e sur la structure des donn es qui est elle m me exprim e en termes de fonctions abstraites La m thode de conception est guid e par les donn es mais elle installe les fonctions a leur juste place 1 2 Analyse et conception 9 FIG 1 2 L objet p1 instance de la classe POINT symbolis par une calculette Toutefois l objectif de la m thode est bien la conception et l implantation de logiciel et non pas la simple sp cification Un module est donc l implantation d un type abstrait de donn es le type lui m me n tant qu une sp cification Une m thode visant la construction de logiciel a partir de tels modules doit aller de pair avec un langage de programmation permettant d implanter les modules Pour r sumer cette m thode de conception permet un d veloppement fond sur une sp cification pr cise de classes en termes de besoins services offerts aux clients et de contraintes propri t s de ces services Un objet est d fini donc c
231. u un objet n est souvent qu un composant d un r seau d objet Dans ce cas faut il copier seulement l objet lui m me Ou le sous graphe d objet atteignable partir de cet objet La r ponse cette question est d pendante de 1 application que nous voulons crire En java si le programmeur veut un moment ou autre dupliquer un objet c est lui d crire le code permettant de dupliquer cet objet Il y a plusieurs m thodes pour faire cela La m thode privil gi e par Java est la red finition de la m thode clone Red finir signifie ici qu elle existe d j quelque part comme nous le verrons dans le chapitre sur l h ritage mais que le programmeur choisit de la sp cialiser pour les be soins propres des objets de cette classe L utilisation de cette m thode demande plus de connaissance sur le langage que nous n en disposons pour l instant Par contre nous pouvons tout a fait utiliser une technique bien connue des programmeur C les copy constructeurs Cette technique n est pas incompatible avec la gestion des clones privil gi e en Java Il s agit d utiliser la surcharge param trique cf pour d finir un nouveau constructeur prenant en param tre un objet de la classe cf fi gure La figure 3 41 illustre l action du copy constructeur d finit dans la class Mauhly Ce copy constructeur recopie variable d instance pour variable d instance l tat de l objet original Mais bien
232. uccit cette exception La machine virtuelle essaie ensuite de transf rer l ex cution un des blocs de code sui vant une clause catch Pour s lectionner un bloc l environnement cherche dans l ordre de 8 3 Exception et h ritage 149 leur d claration ici Exceptionl Exception2 le bloc de la clause catch o le type sp cifi permet la variable d clar e d tre affect e par une r f rence vers l exception en cours de traitement C est bien entendu le type dynamique de celle ci qui est consid r cf 3 3 Une fois une clause catch s lectionn e l ex cution continue partir du d but du bloc lui correspondant jusqu la fin de celui ci Si le bloc est susceptible de lever des exceptions v ri fi es elles doivent soit tre captur es par une autre clause try catch dans ce bloc soit le bloc englobant la clause try catch initiale devra capturer ou propager cette nouvelle exception Si une clause finally suit les clauses try catch elle sera toujours ex cut e apr s le bloc du try si il n y a eu d exception ou le bloc de la clause catch s lectionn e dans le cas contraire Il faut noter qu il est parfaitement possible d crire une clause try sans clauses catch avec seulement une clause finally Cette dernier sera donc toujours ex cut e 8 3 Exception et h ritage Il est parfaitement possible qu une exception lev e dans un bloc d une clause finally masque une exception lev e dans u
233. ure BorderLayout EAST panel pour visualiser le contenu du sac JPanel p3 new JPanel p3 setBackground Color green JList 1 new JList m getEquip p3 add 1 aggr gation des diff rents panel f getContentPane add p1 BorderLayout WEST f getContentPane add p2 BorderLayout NORTH f getContentPane add p3 BorderLayout CENTER Arbre pr t Affichage f pack f setVisible true 162 Le graphique Figure 9 11 Autre Instanciation des algorithmes de placement l Ouest i Au centre f Les a i Se e pi JPanel JPanel _ Le Au nord Centre IN force aa s 4 _ p2 p3 JPanel JPanel vie lt i JLabel JList arme armure JLabel JLabel img JLabel Figure 9 12 Instanciation des algorithmes de placement jArme 7 Armure 2 Arme Armure 2 Nous avons r alis une autre gestion du placement La figure 9 11 repr sente la nouvelle gestion du placement Nous voulions passer nom force vie sur le cot droit et consacr la partie centrale de l cran l affichage du reste des informations Nous avons pour cela cr un nouveau noeud interm diaire pour contenir la liste des quipements et affichage des
234. ure exemple Apr s avoir vu quand et comment les exceptions sont tre g n r es voyons comment le programmeur peut les prendre en compte dans son code pour effecturer des traitements adapt s Pour capturer les exceptions qu un bloc d instructions peut lever il suffit de placer ce bloc dans une clause try catch Voyons cela sur l exemple d utilisation de la m thode deplacer de la figure 8 4 Figure 8 4 Capture d une exception FabriqueDeMonstres fabMonstres FabriqueDeCases fabCases Plateau p new Plateau fabCases 16 9 Monstre m fabMonstres fabriquerUnMonstre p poser m 0 0 Random rand new Random for int i 0 i lt 40 i try p deplacer m m estSur rand nextInt 8 1 System out printin p toString catch DeplacementHorsDuPlateauException e System out printin La direction e getDirection n est pas valide a partir de x e getCase getX Ly e getCase getY syntaxe et fonctionnement La syntaxe plus exacte de l instruction catch est la suivante try code catch Exception2 e1 code 1 catch Exception2 e2 code 2 finally code Explicitons plus en d tail le fonctionnement a l ex cution de cette construction 14 18 Si une exception est lev e pendant l ex cution du bloc suivant la clause try l ex cution du bloc est imm diatement arr t e l endroit du code qui a s
235. ute maintenant la premi re ligne public static void main String args gt Mauhly momo new Mauhly System out printin momo getVie momo reposer System out printin momo getVie Pour affecter une valeur la r f rence momo il faut d j valuer l expres sion de droite new Mauhly Cette instruction cr e v ritablement l objet dans le tas L tat des diff rentes variables est soit celui sp cifi dans la classe comme pour int exp 0 sinon c est le compilateur qui attribue des valeurs par d faut 0 pour les entier nu 11 pour les r f r rences 2 Ce qui n est pas totalement vrai en ce qui concerne le tas En effet toutes les variables de classes sont initialis es d s le chargement des classes cf section Par exemple la classe System est charg e syst matiquement d s le lancement de la machine Java et System out est bien une r f rence sur un objet de classe Print St ream qui existe dans le tas 3 3 Instanciation et appel de m thode 47 la pile d appel le tas d objets Maulhy1 Maulhy nom null Point de Vie 0 momo _ args Exp rience 0 Force 0 FIG 3 14 new Mauhly la pile d appel le tas d objets Maulhy1 Mauhly u nom null momo Point de Vie 0 args main args Exp rience 0 Force 0 FIG 3 15 Mauhly momo new Maulhy Donc l valuation de l expression new Mauhly g n re un nouvel ta
236. videmment dans ce programme il n existe qu une seule 6 on parle alors de copie profonde ou deep copy 3 6 R f rences 63 la pile d appel le tas d objets m1 Maulhy nom affreux Point de Vie 100 Exp rience 0 Force 10 a Arme destr 5 Temmi 7 TRZ MES m2 Maulhy nom affreux Point de Vie 100 Exp rience 0 Force 10 FIG 3 41 Graphe d objet apr s copie partielle arme et armure partag s par les deux instances de Mauhly La copie ici n est pas pro fonde Si nous voulons obtenir une copie compl te il faut dupliquer les objets arme et armure La figure 3 43 montre comment nous avons d finit les copy constructeur dans les classes arme et armure et comment nous avons modifi le copy constructeur de la Mauhly en cons quence La figure 3 43 montre l tat du graphe d objets apr s ex cution du copy constructeur d finit dans Mauhly H faut bien remarquer cette comment l objet m1 a t dupliqu totalement et non partiellement cf 3 41 3 6 5 Egalit des r f rences Ces probl mes d affectation de r f rences de copies entraine dans leurs sillages les probl mes d galit En effet si j ai deux r f rences a et b sur des objets de m me type Que signifie exactement a b Est ce l galit des r f rences ou des objets r f renc s Le programme de la figure 3 44 r pond la question En java l galit ent
237. void accept Visiteur Method Arme 0 aload_0 1 invokespecial 7 lt Method Equipement gt 4 return Method void accept Visiteur O getstatic 8 lt Field java io PrintStream out gt 3 Ide 1 lt String Arme accept gt 5 invokevirtual 9 lt Method void printin java lang String gt 8 aload_1 9 aload_ 0 10 invokevirtual 10 lt Method void visiter Equipement gt 13 return FIG 5 3 D compilation de la classe Arme de l exemple 5 2 l ex cution du programme Test demeure celle de la figure 5 2 En effet le code g n r pour la classe Arme n a pas chang e et donc la signature de la m thode visiter recherch e lors de la liaison dynamique est visiter Equipement m me si la nouvelle m thode ajout e est plus sp cifique Pour que la nouvelle m thode soit prise en compte il faut recompiler les classes clientes les classes Equipement et Arme dans notre cas Comme indiquer pr c demment cette solution peut ne pas tre praticable si par exemple la classe Visiteur est distribu e dans un package part et que le reste de l application est d j d ploy e Figure 5 3 Surcharge d une m thode de visiteur class Visiteur public void visiter Equipement e System out println visiter Equipement public void visiter Arme a System out println visiter Arme Code de d fense Une solution d fensive pour contourner le probl me pr c dent est conseill
238. x cution ce qui termine aussi l ex cution de la m thode reposer Il tait possible d crire la m thode reposer de la mani re suivante public void reposer vie vie 10 3 2 Les Classes 37 Controleur d acc s private Mauhly from Logical View Borce int Attributs Relation Bie int Bex int 0 BgetForce int NOM String mor ae m thodes from lang EsetVie viep int void Mireposer void public Valeur de retour FIG 3 6 La repr sentation UML de la class Mauhly Le comportement de ces deux d finitions est exactement le m me Mais un pro grammeur objet pr f rera la premi re solution En effet dans ce cas la d finition de reposer ne d pend que des fonctions d acc s Si par exemple je d cide de changer le nom de la variable d instance vie seul les acc sseurs et modificateurs sont concern s Dans la deuxi me solution tous les utilisateurs de la variable d ins tance sont concern s L impact d un changement est potentiellement plus fort dans la deuxi me solution Il y a une deuxi me raison si je d cide que toute modification de la vie d un Maulhy ne peut se faire que si il n est pas paralys par exemple je peux rajouter ce test dans la m thode set Vie sans modifi le reste de la d finition de la classe La encore l impact du changement est r duit en appliquant juste de convention d cri ture Ces convention
239. x ae lt 1 Protection Ame Potion DcoefProtection int TcoefDegat int s_applique S7 5 getCoefProtection get CoefDegat g 4 setCoefProtection setCoefDegat PotionDeVie PotionParalysante A lt f if K i A De ru A r i x Massue Glai aive Hache f N gt rmure Bouclier gt AR i F hy Ke SA ArmureA cier ArmureArain BouclierAcier BouclierBois FIG 4 1 Diagramme de classe pour les quipements d un joueur 4 2 Syntaxe en Java En Java pour d finir une classe par h ritage il faut utiliser le mot clef extends En effet une sous classe tend et modifie la d finition de sa super classe Pour la classe Equipement de laquelle d rivent les classes Protection et Armure d rivant de nous obtenons respectivement le code des figures Fig 4 1 Fig 4 2 et Fig 4 3 Dans ce dernier exemple on constate que le corps de la classe est vide ce qui correspond bien la remarque faite dans la section pr c dente elle n introduit rien de nouveau sauf son nom par rapport sa super classe Figure 4 1 Code de la classe Equipement public class Equipement int masse int valeur int getMasse return masse void setMasse int masse this masse masse int getValeur return valeur void setValeur int valeur this val

Download Pdf Manuals

image

Related Search

Related Contents

lea con atención este manual de instrucciones antes de  9. Troubleshooting  MA225e Amplifier  Detector de fugas de microondas Modelo EMF300  HP CloudSystem Foundation User's Guide  Télécharger le manuel  RIMBOU Lotus MANUAL  ワイヤーエキスパート取扱説明書(日本語)ver7.0  This page intentionally blank.  Philips Splitter SWV4556H  

Copyright © All rights reserved.
Failed to retrieve file