pdf 6 par page
Transcription
pdf 6 par page
Static Static static : usage static Le rôle essentiel d’un moule est de permettre la création d’objets. ... mais un moule a également des caractéristiques Static La déclaration des attributs de classe se fait à l’aide du mot réservé static il doit être limité et justifié public class StaticExample { private static int compteur; public static double pi = 3.14159; } Méthodes : a priori quasiment jamais Il en est de même pour une classe. Usage : utilisation de la notation “.” respect des modificateurs n’est visible que par des instances de la classe ֒→ en quelque sorte : attribut (privé) partagé par les instances StaticExample.pi visible partout StaticExample.compteur En JAVA, les caractéristiques de classes sont qualifiées de statiques USTL http://www.lifl.fr/∼routier pas réellement “objet”, mais pratique... plutôt réservé pour les méthodes “utilitaires” 2 USTL http://www.lifl.fr/∼routier Static java.lang.Math 4 USTL java.net.InetAddress.getLocalHost() Static Attributs de classe Static Les méthodes aussi... public class StaticExample { public static void staticMethod() { System.out.println("ceci est une méthode statique"); } } La définition de chaque classe est unique, donc les attributs de classes existent en un seul exemplaire. Ils sont créés au moment où la classe est chargée en mémoire par la JVM. quel que soit le nombre d’instances (y compris 0) static 6 http://www.lifl.fr/∼routier Invocation : StaticExample.staticMethod() Il n’est pas nécessaire de créer une instance pour utiliser une caractéristique statique. pas besoin d’instance !!! pas d’instance donc pas d’utilisation de this dans le corps d’une méthode statique donc pas d’accès “direct” aux attributs et méthodes de la classe ! USTL http://www.lifl.fr/∼routier 1 USTL http://www.lifl.fr/∼routier 3 USTL http://www.lifl.fr/∼routier 5 Static Static Static Application : les types énumérés en JAVA Attributs : à user avec parcimonie et pertinence inconvénients (nombreux et “sérieux”) en private : “mémoire” partagée par les instances Illustration : compteur d’instances créées. USTL http://www.lifl.fr/∼routier pas de type/classe !!! ֒→ Si on veut une méthode qui prend pour paramètre un jour de la semaine, le paramètre sera un int ! ⇒ pas d’objet les valeurs sont des entiers “indifférenciables” À la différence d’un langage comme A DA, la définition par l’utilisateur de types énumérés n’est pas une fonctionnalité primitive. public class StaticIllustration { private static int counter = 1; private String name; public StaticIllustration() { this.name = "instance-"+(counter++); } public String getName() { return this.name; } } ... StaticIllustration si1 = new StaticIllustration(); StaticIllustration si2 = new StaticIllustration(); System.out.println("si1 -> "+si1.getName()); System.out.println("si2 -> "+si2.getName()); ... +--------------------| si1 -> instance-1 | si2 -> instance-2 +--------------------- ⇒ conception nécessaire par l’utilisateur public void methodWithDay(int day) { ... } ... anObject.methodWithDay(DaysOfWeek.TUESDAY); anObject.methodWithDay(2+3); // sens ? anObject.methodWithDay(12); // accepté par compilation !!! Type = Classe ⇒ création d’un classe pour définir le type énuméré Valeurs du type = constantes ⇒ utilisation de variables static et final cette solution n’est pas orientée objet !!! 8 USTL http://www.lifl.fr/∼routier Static 10 USTL http://www.lifl.fr/∼routier Static avec final : création de constantes cas particulier : méthode main : 12 Static Solution 1 public class ConstantExample { public static final float PI = 3.141592f; public static final String BEST BOOK = "Le Seigneur des..."; } public class AClass { ... public static void main(String[] args) { ... } } Le qualificatif final signifie qu’une fois initialisée la valeur ne peut plus être modifiée. (convention de nommage : les identifiants des constantes sont en majuscules et usage “ ”). Boolean.TRUE, Double.MAX VALUE public class DaysOfWeek { public static final int public static final int public static final int public static final int public static final int public static final int public static final int } // DaysOfWeek Méthode appelée lors du lancement de la JVM JAVA avec comme argument AClass, les autres arguments sont les valeurs de args[]. MONDAY = 0; TUESDAY = 1; WEDNESDAY = 2; THURSDAY = 3; FRIDAY = 4; SATURDAY = 5; SUNDAY = 6; java AClass arg0 arg1 ... “avantages” → possibilité d’utiliser les valeurs dans une expression switch ∼ “programme à exécuter” USTL http://www.lifl.fr/∼routier 7 USTL http://www.lifl.fr/∼routier 9 USTL http://www.lifl.fr/∼routier 11 Static fichiers de projet javac et java Amélioration fichiers de projet Paquetages JAVA est un langage compilé permettre la gestion une relation d’ordre (première version) ∼ bibliothèques JAVA Regrouper les classes selon un critère (arbitraire) de cohésion : prévoir l’“affichage”. public class DaysOfWeek { private String name; private static int counter = 0; private DaysOfWeek(String name) { this.name = name; this.index = counter++; } public final int index; // final donc pas modifiable public static final DaysOfWeek MONDAY = new DaysOfWeek("Monday"); ... public String toString() { return this.name; } } // DaysOfWeek ...... DaysOfWeek aDay = expression; DaysOfWeek anotherDay = expression; if (aDay.index < anotherDay.index) { System.out.println(aDay+" avant "+anotherDay); } USTL 14 http://www.lifl.fr/∼routier dépendances entre elles cohérence fonctionnelle ... compilateur (de base) = javac ( d’autres... jikes) NomClasse.java −→ NomClasse.class un paquetage peut eux aussi être décomposé en sous-paquetages Exécution d’un programme (“.class”) : Le nom complet de la classe NomClasse du sous-paquetage souspackage du package nompackage est : java NomClasse [args] si la classe NomClasse définit la méthode statique nompackage.souspackage.NomClasse public static void main(String[] args) notation UML : nompackage::souspackage::NomClasse USTL 16 http://www.lifl.fr/∼routier Static USTL 18 http://www.lifl.fr/∼routier fichiers de projet fichiers de projet CLASSPATH Une solution “objet” il faut que : les valeurs soient constantes et typées (du type construit !) le nombre de valeurs dans le type soit fixe public class DaysOfWeek { private DaysOfWeek() { } public static final DaysOfWeek public static final DaysOfWeek public static final DaysOfWeek public static final DaysOfWeek public static final DaysOfWeek public static final DaysOfWeek public static final DaysOfWeek } // DaysOfWeek USTL La variable d’environnement CLASSPATH est utilisée pour localiser toutes les classes nécessaires pour la compilation ou l’exécution. Elle contient la liste des répertoires où chercher les classes nécessaires. Par défaut elle est réduite au répertoire courant (“.”). Les classes fournies de base avec le jdk sont également automatiquement trouvées. J AVA : gestion des fichiers d’un projet MONDAY = new DaysOfWeek(); TUESDAY = new DaysOfWeek(); WEDNESDAY = new DaysOfWeek(); THURSDAY = new DaysOfWeek(); FRIDAY = new DaysOfWeek(); SATURDAY = new DaysOfWeek(); SUNDAY = new DaysOfWeek(); Il est possible de spécifier un “classpath” propre à une exécution/compilation : (W INDOWS) java/javac -classpath bid;.;/truc/classes;%CLASSPATH% ... (L INUX /U NIX) java/javac -classpath bid:.:/truc/classes:$CLASSPATH ... constructeur privé : aucune autre instance ne peut être créée les valeurs sont de type DaysOfWeek comparaison avec == a un sens public void methodWithDay(DaysOfWeek day) http://www.lifl.fr/∼routier ... 13 USTL http://www.lifl.fr/∼routier 15 USTL http://www.lifl.fr/∼routier 17 fichiers de projet fichiers de projet Création de paquetage Archives : jar project AClass.java util déclaration : première ligne de code du fichier source : package nompackage; ou package nompackage.souspackage; convention : nom de paquetage en minuscules UtilClass.java ··· gui ··· Regrouper dans une archive les fichiers d’un projet (compressés). Faciliter la distribution. project project.util project.gui project.gui.event syntaxe et paramètres similaires au tar event PrjEvent.java Le paquetage regroupe toutes les classes qui le déclarent. Une classe ne peut appartenir qu’à un seul paquetage à la fois. fichiers de projet jar ctxu[vfm0M] [nom-jar] [nom-manifest] [-C rép] fichiers ... ··· à partir de la racine des paquetages : javac project\*.java javac project\util\*.java fr.univ-lille1.fil.licence.project et les fichiers .class sont placées dans une hiérarchie de répertoire copiant celle des paquetages/sources PB : Quand créer un nouveau paquetage ? Quoi regrouper ? et il faut que le répertoire racine du répertoire nompackage soit dans le CLASSPATH Assurer l’unicité des noms : utilisation des noms de domaine “renversés” c création v “verbose” : bavard x extraction f spécifier le d’archives t afficher “table des matières” u mettre à jour (update) nom du fichier m inclure le manifeste etc. java nompackage.souspackage.NomClasse [args] USTL 20 http://www.lifl.fr/∼routier USTL 22 http://www.lifl.fr/∼routier fichiers de projet Utilisation de paquetages jar cf archive.jar Classe1.class Classe2.class jar cvf archive.jar fr gnu jar xf archive.jar USTL 24 http://www.lifl.fr/∼routier fichiers de projet fichiers de projet Le modificateur “ ” Correspondance avec la structure de répertoires Nouvelle règle de visibilité pour attributs, méthodes et classes : absence de modificateur (mode “friendly”). Utiliser le nom complet : Tout ce qui n’ est pas marqué est accessible uniquement depuis le paquetage dans lequel il est défini (y compris les classes). String valeur = new java.math.BigInteger("123"); Importer la classe : import Permet d’éviter la précision du nom de paquetage avant une classe (sauf si ambiguı̈té) On peut importer tout un paquetage ou seulement une classe du paquetage. La déclaration d’importation d’une classe se fait avant l’entête de déclaration de la classe. Intérêt : masquer les classes propres au choix d’implémentation À chaque paquetage doit correspondre un répertoire de même nom. Il existe toujours un paquetage par défaut : le paquetage “anonyme”. Toutes les classes qui ne déclarent aucun paquetage lui appartiennent. Les fichiers sources des classes du paquetage doivent être placés dans ce répertoire. Chaque sous-paquetage est placé dans un sous-répertoire (de même nom). import java.math.BigInteger; public class AClass { String valeur = new BigInteger("123"); } toujours créer un paquetage import java.math.*; public class AClass { String valeur = new BigInteger("123"); } “Officialisation” de l’existence du paquetage Permettre une réutilisation sans craindre l’ambiguı̈té de nom. Permettre la distribution. L’importation java.lang.* est toujours réalisée. USTL http://www.lifl.fr/∼routier 19 USTL http://www.lifl.fr/∼routier 21 USTL http://www.lifl.fr/∼routier 23 fichiers de projet JAVA D OC fichiers de projet Organisation des fichiers FichierClasse.java Pour chaque projet, créer l’arborescence : project répertoire racine un fichier README.TXT présentant le projet et à terme le jar exécutable et le manifeste. −→ FichierClasse.html Commentaires encadrés par /** ... */ utilisation possible de tags HTML project src Tags spécifiques : classe @version, @author, @see, @since méthode @param, @return, @exception, @see, @deprecated README.TXT classes doc classes doc conservation de l’arborescence des paquetages les .class générés la javadoc générée + ··· liens hypertextes “entre classes” .../project/src> javac -d ../classes *.java package1/*.java etc. .../project/src> javadoc -d ../doc . .../project/classes> jar cvfm ../project.jar themanifest . .../project> jar uvf project.jar src doc javadoc TestJavaDoc.java -author -d ./javadoc USTL src racine de l’arborescence des paquetages avec sources .java 26 http://www.lifl.fr/∼routier USTL http://www.lifl.fr/∼routier fichiers de projet 28 fichiers de projet jar cvfm archive.jar mymanifest fr -C ../images/ image.gif /** description de la classe * @author <a href=mailto:[email protected]> Bilbo Baggins</a> * @version 0.0.0.0.1 */ public class TestJavaDoc { /** commentaire attribut */ public int i; /** ... */ public void f() {} /** commentaire sur la methode avec <em>tags html</em> * sur plusieurs lignes aussi * @param i commentaire paramètre * @return commentaire retour * @exception java.lang.NullPointerException commentaire exception * @see #f() */ public String uneMethode(Integer i) throws NullPointerException{ return("value"); } } // TestJavaDoc manifest : fichier dans META-INF/MANIFEST.MF → jar “exécutable” : Main-Class: classname (sans .class) puis java -jar archive.jar Utilisation des classes contenues dans une archive sans extraction : mettre le fichier jar dans le CLASSPATH. SETENV CLASSPATH $CLASSPATH:/home/java/jars/paquetage.jar ou java -classpath $CLASSPATH:/home/java/jars/paquetage.jar ... USTL http://www.lifl.fr/∼routier 25 USTL http://www.lifl.fr/∼routier 27