Protection et portée (1) Contre-exemple : Java : notions complémentaires (portée, protection, modificateurs, interfaces, exceptions) Master 1ère année Julien Velcin http://mediamining.univ-lyon2.fr/velcin public class Vecteur { public double [] tab; } définition de la classe Programmeur A public static void main(…) { Vecteur v = new Vecteur() ; v.tab = new double[5] ; utilisation de la classe Programmeur B v.tab[6] = 2.5; } v.tab Mauvaise définition ! Protection et portée (2) • Objectifs : o développement = travail d’équipe. â risques d’erreurs et de mauvaise utilisation. o contrôler l’accès aux champs. o masquer le code interne au fonctionnement d’une classe. • Portée : niveaux de visibilité Mots clefs : private (-): classe courante. protected (#): classe courante et héritiers. public (+): classe courante, héritiers et instances. à insérer avant la déclaration des champs/méthodes. v.tab 2.5 Protection et portée (3) • Démarche et mécanisme : o empêcher l’accès direct aux champs. accesseurs : méthodes d’accès à un champ. mutateurs : méthodes de modification d’un champ. o définir la porté des méthodes. Exemple : public class Vecteur { private int price; public void setPrice(int val) { if (val > 0) price = val; } public int getPrice() { return price; } } champs “price” caché mutateur accesseur Protection et portée (4) Protection et portée (5) Exemple : Exemple (suite) : public class Vecteur { private double[] tab ; public void initialiser(int taille) { tab = new double[taille]; } // accesseur Vecteur v = new Vecteur() ; v.initialiser(5) ; v.setTab(6,2.5); v.tab[6] = 2.5; // accès contrôlé : pas d’erreur // ne compile pas ! private boolean controleIndice(int i) { return (i>=0 && i<tab.length); // méthode interne } public void setTab(int i, double valeur) { if (controleIndice(i)) tab[i] = valeur ; } // mutateur } Protection et portée (6) Exercice: Modifier le programme Location pour tenir compte de la protection. Exemple : private int km; public int getKm() { return …; } public void setKm(…) { km = p_km; } Les modificateurs (1) • Définition : Un modificateur est un mot-clef indiquant des particularités de classes, méthodes ou champs. Syntaxe : public modificateur class NomClasse {…} public modificateur type nomFonction (int param1) {…} public modificateur type nom_variable; Les modificateurs (2) - static Les modificateurs (3) - static • La clause static : application : champs et méthodes • La clause static : Rappel, calcul du prix d'un location • tourisme : 50 Є + 30 Є / jour + 0.50 Є / km a) Application aux champs : Espace mémoire unique pour toutes les instances de la classe. Aujourd’hui, mais demain ? ⎝ Champ (variable) mais valeur identique pour tous les petits vehicules de tourisme. LocaTourisme double prix_jour; double calculPrix(); l1 prix LocaTourisme client1 = new LocaTourisme(); LocaTourisme client2 = new LocaTourisme(); km nb_jours Contrainte : client1.prix_jour = client2.prix_jour. prix_jour charge Les modificateurs (4) - static Exemple : public class LocaTourisme { public static double prix_jour; ... } l1 Les modificateurs (5) - static l2 prix km nb_jours charge l1 l2 km nb_jours l1.prix_jour = 30; 30 prix_jour km nb_jours prix_jour charge public class LocaTourisme { public static void changePrixJour(double p_prix_jour) { prix_jour = p_prix_jour; } } public static void main(…) { LocaTourisme.changePrixJour(45); charge l1 l2.prix_jour = l2.prix_jour + 15; b) Application aux méthodes : Méthodes invocables sans instanciation de la classe. Exemple : prix_jour LocaTourisme l1 = new LocaTourisme (); LocaTourisme l2 = new LocaTourisme (); l2 l2 45 LocaTourisme l = new LocaTourisme(); l.changePrixJour(45); } Idiot ! Les modificateurs (6) - abstract Location - double prix - double km - double nb_jours + void saisieInfos() + void afficherPrix() + double calculPrix() LocaTourisme - boolean a_velo - double prix_jour + double calculPrix() + void changePrixJour(double p) jamais instanciée ⇒ abstract Les modificateurs (7) - abstract • La clause abstract : application : classes et méthodes a) Application aux classes : • objets non manipulés par le programme. • centralise les informations. LocaUtilitaire - boolean charge + double calculPrix() b) Application aux méthodes : • détermine les méthodes obligatoires des classes filles. • pas de corps (quoique… à partir de Java 8 !) Note : • Une classe abstraite est non instanciable. • Une classe redéclare les méthodes abstraites héritées. Les modificateurs (8) - abstract Les modificateurs (9) - final • La public abstract class Location { public abstract double calculPrix(); } public class LocaTourisme extends Location { public double calculPrix() { prix = 30*jours + 0,5*km; return super.calculPrix(); } } ... clause final : application : classes, méthodes et champs a) Classes : • Étendue b) Méthodes : • Outrepassée c) Champs : • Modifiable ⇒ Cste Interfaces (1) Interfaces (2) Pas d’héritage multiple en Java. è On utilise des interfaces. • Interface = Comportements des objets. Ex : s’écrire dans un fichier, se dessiner à l’écran … Comportement ⇒ méthodes ObjectOutputStream • Interface = Contrat entre objets. Ex : classe ObjectInputStream = « j accepte d écrire les objets dans un flux SI ils signent le contrat de sérialisation.» : Permettre à des classes sans relations d’héritage d’utiliser des méthodes communes. • Démarche et mécanisme : o interface = classe abstraite. § méthodes: abstract & public § champs: public, static & final o implémentation / différentes classes § définition du corps des méthodes obligatoires (à partir de Java 8 : existence d’implémentations par défaut) MonObjet Serializable Comportement : se « sérialiser » Interfaces (3) • Objectifs j accepte d être écrit dans un flux j écris les objets dans un flux Interfaces (4) Syntaxe : public interface NomInterface { NomInterface.java type nom_variable; ⇔ public static final … type methode_un (type nom_param); ⇔ abstract … } public class NomClasse implements NomInterface { type methode_un (type nom_param) { … } } Obligatoire ! Exceptions (1) • Objectif : gestion des erreurs engendrées à l exécution. Exemple : FileInputStream R = new FileInputStream("test.txt"); Compile. Erreur à l exécution si test.txt n existe pas. Prévenir l erreur potentiel. Exceptions (2) • Mécanisme : Repérer les méthodes A qui jettent des exceptions, puis : o rediriger les exceptions dans les méthodes B qui appellent les méthodes A, o OU : gérer les exceptions directement. Exemple (1) : FileInputStream R = new FileInputStream("test.txt"); jette (throws) : FileNotFoundException Vector V = new Vector(); v.elementAt(-8); jette (throws) : ArrayIndexOutOfBoundsException Exceptions (3) • A la compilation: FilmCollec.java:50: unreported exception java.io.FileNotFoundException must be caught or declared to be thrown FileOutputStream w = new FileOutputStream("test.dat"); • Dans les spécifications (extrait de http://java.sun.com/j2se/1.5.0/docs/api/): Exceptions (4) Note : FileInputStream renvoie deux types d exceptions. Un seul type (FileNotFoundException) génère une erreur de compilation. Exception FileInputStream public FileInputStream(File file) throws FileNotFoundException Creates a FileInputStream by opening a connection to an actual file, the file named by the File object file in the file system. A new FileDescriptor object is created to represent this file connection… Parameters: file - the file to be opened for reading. Throws: FileNotFoundException - if the file does not exist, is a directory rather than a regular file, or for some other reason cannot be opened for reading. SecurityException - if a security manager exists and its checkRead method denies read access to the file. RuntimeException SecurityException Les exceptions dérivées de RuntimeException ne génèrent pas d erreurs à la compilation FileNotFoundException Exceptions (5) Exceptions (6) Syntaxe (b) : Syntaxe (a) : try { public TypeRetour nomMethod() throws TypeException, … Exemple (2a) : Dans la classe Bar: // instructions sensibles } catch (TypeException nom_exception) { // Si une exception de type TypeException est renvoyée, } finally { // Dans tous les cas. } Exemple (2b) : dans la classe MainFilm public void enregistrer() throws IOException { FileOutputStream w = new FileOutputStream("test.dat"); ObjectOutputStream o = new ObjectOutputStream(w); o.writeObject(maListe); o.close(); W.close(); } Bar b = new Bar(); try { b.enregistrer(); } catch (IOException io) { System.out.println("Impossible d écrire la collection"); } finally { System.out.println("Dans tous les cas"); } Exceptions (7) Bar b = new Bar(); try { b.enregistrer(); } catch (Exception e) { System.out.println("Il y a un problème"); } Exceptions (8) • Créer sa propre exception public class MonException extends Exception { public MonException(String t, etc.) { super(t); // et d autres initialisations si besoin } (...) } Exceptions (9) Exceptions (8) • Lancer une exception IOException IOException Syntaxe : throw new UneExceptionDeVotreChoix(paramètres); Exemple : public class MaClasse { public void maFonction(...) throws UneException { throw new UneException("Texte décrivant l erreur"); } ObjectOutputStream Bar writeObject() jette IOException enregistrer() jette IOException main(…) attrape IOException …et la traite (...) } Commentaires et Javadoc Plan du cours • Sur une ligne : // Comme en C++ , après un slash-slash int i; // commentaire jusqu à la fin de la ligne • Sur plusieurs lignes : /* Comme en C , entre un slash-étoile et un étoile-slash, sur plusieurs lignes */ • Pour la Javadoc : /** * pour l utilisation de Javadoc * à réserver pour la documentation automatique * avec javadoc */ â commenter le plus possible et judicieusement chaque déclaration (variable, mais aussi méthode, classe). â commenter clairement (utiliser au mieux les 3 possibilités) • • • • • • Introduction au langage Java Programmation Orientée Objet Notions complémentaires Quelques API standards Interface graphique en Java FX API pour la recherche d’information