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