Programmation Java/Extensions
Les extensions, ou packages, permettent de grouper ensemble des classes rattachées, à la manière des dossiers qui permettent de classer des fichiers.
Utilisation[modifier | modifier le wikicode]
Le fichier à inclure dans une extension doit contenir le mot-clé 'package
' suivi du nom de l'extension.
Ce nom peut être composé de plusieurs mots séparés par un point ( .
).
Exemple[modifier | modifier le wikicode]
pour inclure la classe Toto dans l'extension 'mesPackages.sousPackage1
', écrire au début du fichier Toto.java :
package mesPackages.sousPackage1;
// ne pas oublier le point-virgule en fin de ligne
La structure des répertoires doit suivre le nom de l'extension, c'est-à-dire que le fichier Toto.java doit se situer dans un sous-répertoire mesPackages/sousPackage1/Toto.java.
Lorsqu'ensuite on désire utiliser la classe Toto depuis une autre classe, il faudra au préalable écrire :
import mesPackages.sousPackage1.Toto;
ou
import mesPackages.sousPackage1.*;
// importation de toutes les classes
// de l'extension mesPackage.sousPackage1
ou utiliser directement une référence à l'extension :
mesPackages.sousPackage1.Toto toto
= new mesPackages.sousPackage1.Toto();
Remarques[modifier | modifier le wikicode]
En Java, les programmeurs attribuent généralement un nom qui commence par une minuscule pour une extension, et un nom qui commence par une capitale pour une classe.
Les bibliothèques Java destinées à être distribuées regroupent leurs classes dans une ou plusieurs extensions dont le nom est normalement précédé par un nom de domaine (dans l'ordre inverse), par exemple :
package org.wikibooks.exemple;
Compilation[modifier | modifier le wikicode]
L'utilisation d'une extension nécessite une structure des répertoires correspondant au nom de l'extension.
Par exemple, le fichier Toto.java
définit la classe Toto
de l'extension org.wikibooks.exemple
débute par :
package org.wikibooks.exemple;
class Toto ...
et doit se situer dans le répertoire org/wikibooks/exemple
.
Supposons que le chemin du fichier soit /home/me/javaprog/org/wikibooks/exemple/Toto.java
.
La compilation se fait en spécifiant le chemin du package racine (répertoire parent de org) comme classpath, et en spécifiant ensuite le chemin relatif à ce répertoire :
javac -classpath /home/me/javaprog org/wikibooks/exemple/Toto.java
Quand un programme Java utilise cette classe, il doit être compilé et exécuté en spécifiant /home/me/javaprog
(package racine) pour le paramètre classpath, et le nom de la classe doit inclure le nom du package :
java -classpath /home/me/javaprog org.wikibooks.exemple.Toto
Import statique[modifier | modifier le wikicode]
Pour utiliser les membres statiques publiques d'une classe, il faut nommer la classe où ils sont définis.
Exemple 1 :
double r = Math.cos(Math.PI * theta);
L'import statique permet d'importer les membres statiques d'une classe afin de ne pas nommer la classe en question.
Exemple 1 :
// importer le membre statique PI seulement
import static java.lang.Math.PI;
...
double r = Math.cos(PI * theta);
Exemple 2 :
// importer tous les membres statiques de la classe java.lang.Math
import static java.lang.Math.*;
...
double r = cos(PI * theta);
L'abus d'import statique n'est pas conseillé car le code ne contient plus de référence à la classe définissant le membre statique utilisé. Il ne faut l'utiliser que si les membres statiques d'un petit nombre de classes sont utilisés fréquemment.
Importation de packages de .jar[modifier | modifier le wikicode]
Pour importer un package d'un fichier .jar
, il faut s'assurer que le fichier est dans le classpath courant (à compile- et execution-time). Ensuite, l'import se déroule comme si le .jar était décompressé.
Par exemple, pour compiler et lancer une classe d'un projet du dossier parent (contenant deux répertoires : /source
et /libraries
) compiler :
$ javac -classpath libraries/lib.jar source/MainClass.java
Puis le lancer :
$ java -classpath libraries/lib.jar source/MainClass
Cela nécessite que MainClass
soit le package par défaut, ou un package appelé source
, ce qui n'est pas très explicite.