Java - Paquets
Les packages sont utilisés en Java afin d'éviter les conflits de noms, de contrôler l'accès, de faciliter la recherche/localisation et l'utilisation des classes, des interfaces, des énumérations et des annotations, etc.
Un forfait peut être défini comme un regroupement de types associés (classes, interfaces, énumérations et annotations) fournissant une protection d'accès et une gestion des espaces de noms.
Certains des packages existants en Java sont −
-
java.lang − regroupe les classes fondamentales
-
java.io − les classes pour les fonctions d'entrée et de sortie sont regroupées dans ce package
Les programmeurs peuvent définir leurs propres packages pour regrouper des groupes de classes/interfaces, etc. Il est recommandé de regrouper les classes liées que vous implémentez afin qu'un programmeur puisse facilement déterminer que les classes, les interfaces, les énumérations et les annotations sont liées.
Étant donné que le package crée un nouvel espace de noms, il n'y aura pas de conflits de noms avec les noms d'autres packages. En utilisant des packages, il est plus facile de fournir un contrôle d'accès et il est également plus facile de localiser les classes associées.
Création d'un paquet
Lors de la création d'un package, vous devez choisir un nom pour le package et inclure un package avec ce nom en haut de chaque fichier source contenant les classes, les interfaces, les énumérations et les types d'annotation que vous souhaitez inclure dans le package.
L'instruction package doit être la première ligne du fichier source. Il ne peut y avoir qu'une seule instruction de package dans chaque fichier source, et elle s'applique à tous les types du fichier.
Si une instruction de package n'est pas utilisée, la classe, les interfaces, les énumérations et les types d'annotation seront placés dans le package par défaut actuel.
Pour compiler les programmes Java avec des instructions de package, vous devez utiliser l'option -d comme indiqué ci-dessous.
javac -d Destination_folder file_name.java
Ensuite, un dossier avec le nom de package donné est créé dans la destination spécifiée, et les fichiers de classe compilés seront placés dans ce dossier.
Exemple
Regardons un exemple qui crée un package appelé animaux . Il est recommandé d'utiliser des noms de packages avec des lettres minuscules pour éviter tout conflit avec les noms de classes et d'interfaces.
L'exemple de package suivant contient une interface nommée animaux −
/* File name : Animal.java */ package animals; interface Animal { public void eat(); public void travel(); }
Maintenant, implémentons l'interface ci-dessus dans le même package animaux −
package animals; /* File name : MammalInt.java */ public class MammalInt implements Animal { public void eat() { System.out.println("Mammal eats"); } public void travel() { System.out.println("Mammal travels"); } public int noOfLegs() { return 0; } public static void main(String args[]) { MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
Compilez maintenant les fichiers java comme indiqué ci-dessous −
$ javac -d . Animal.java $ javac -d . MammalInt.java
Maintenant un package/dossier avec le nom animaux seront créés dans le répertoire courant et ces fichiers de classe y seront placés comme indiqué ci-dessous.
Vous pouvez exécuter le fichier de classe dans le package et obtenir le résultat comme indiqué ci-dessous.
Mammal eats Mammal travels
Le mot clé d'importation
Si une classe souhaite utiliser une autre classe dans le même package, le nom du package n'a pas besoin d'être utilisé. Les classes d'un même package se trouvent sans syntaxe particulière.
Exemple
Ici, une classe nommée Patron est ajoutée au package de paie qui contient déjà Employé. Le patron peut alors faire référence à la classe Employé sans utiliser le préfixe de la paie, comme le montre la classe Patron suivante.
package payroll; public class Boss { public void payEmployee(Employee e) { e.mailCheck(); } }
Que se passe-t-il si la classe Employé n'est pas dans le package de paie ? La classe Boss doit alors utiliser l'une des techniques suivantes pour faire référence à une classe dans un package différent.
- Le nom qualifié complet de la classe peut être utilisé. Par exemple −
payroll.Employee
-
Le package peut être importé à l'aide du mot-clé import et du caractère générique (*). Par exemple −
import payroll.*;
- La classe elle-même peut être importée à l'aide du mot-clé import. Par exemple −
import payroll.Employee;
Remarque − Un fichier de classe peut contenir n'importe quel nombre d'instructions d'importation. Les déclarations d'importation doivent apparaître après la déclaration de package et avant la déclaration de classe.
La structure du répertoire des packages
Deux résultats majeurs se produisent lorsqu'une classe est placée dans un package −
-
Le nom du package devient une partie du nom de la classe, comme nous venons de le voir dans la section précédente.
-
Le nom du package doit correspondre à la structure de répertoire où réside le bytecode correspondant.
Voici un moyen simple de gérer vos fichiers en Java −
Placez le code source d'une classe, d'une interface, d'une énumération ou d'un type d'annotation dans un fichier texte dont le nom est le nom simple du type et dont l'extension est .java .
Par exemple −
// File Name : Car.java package vehicle; public class Car { // Class implementation. }
Maintenant, placez le fichier source dans un répertoire dont le nom reflète le nom du package auquel appartient la classe −
....\vehicle\Car.java
Maintenant, le nom de classe qualifié et le chemin d'accès seraient les suivants −
- Nom de classe → véhicule.Voiture
- Nom du chemin → véhicule\Voiture.java (sous Windows)
En général, une entreprise utilise son nom de domaine Internet inversé pour ses noms de packages.
Exemple − Le nom de domaine Internet d'une entreprise est apple.com, alors tous ses noms de packages commenceraient par com.apple. Chaque composant du nom du package correspond à un sous-répertoire.
Exemple − L'entreprise avait un package com.apple.computers qui contenait un fichier source Dell.java, il serait contenu dans une série de sous-répertoires comme celui-ci −
....\com\apple\computers\Dell.java
Au moment de la compilation, le compilateur crée un fichier de sortie différent pour chaque classe, interface et énumération qui y sont définies. Le nom de base du fichier de sortie est le nom du type et son extension est .class .
Par exemple −
// File Name: Dell.java package com.apple.computers; public class Dell { } class Ups { }
Maintenant, compilez ce fichier comme suit en utilisant l'option -d −
$javac -d . Dell.java
Les fichiers seront compilés comme suit −
.\com\apple\computers\Dell.class .\com\apple\computers\Ups.class
Vous pouvez importer toutes les classes ou interfaces définies dans \com\apple\computers\ comme suit −
import com.apple.computers.*;
Comme les fichiers source .java, les fichiers .class compilés doivent se trouver dans une série de répertoires qui reflètent le nom du package. Cependant, le chemin d'accès aux fichiers .class ne doit pas nécessairement être le même que le chemin d'accès aux fichiers source .java. Vous pouvez organiser vos répertoires source et classe séparément, comme −
<path-one>\sources\com\apple\computers\Dell.java <path-two>\classes\com\apple\computers\Dell.class
En faisant cela, il est possible de donner accès au répertoire des classes à d'autres programmeurs sans révéler vos sources. Vous devez également gérer les fichiers source et de classe de cette manière afin que le compilateur et la machine virtuelle Java (JVM) puissent trouver tous les types utilisés par votre programme.
Le chemin d'accès complet au répertoire des classes,
Supposons que
Un chemin de classe peut inclure plusieurs chemins. Les chemins multiples doivent être séparés par un point-virgule (Windows) ou deux-points (Unix). Par défaut, le compilateur et la JVM recherchent le répertoire courant et le fichier JAR contenant les classes de la plateforme Java afin que ces répertoires soient automatiquement dans le chemin des classes.
Définir la variable système CLASSPATH
Pour afficher la variable CLASSPATH actuelle, utilisez les commandes suivantes sous Windows et UNIX (bourne shell) −
- Sous Windows → C:\> définissez CLASSPATH
- Sous UNIX → % echo $CLASSPATH
Pour supprimer le contenu actuel de la variable CLASSPATH, utilisez −
- Sous Windows → C:\> définissez CLASSPATH =
- Sous UNIX → % unset CLASSPATH ; exporter CLASSPATH
Pour définir la variable CLASSPATH −
- Sous Windows → définissez CLASSPATH =C:\users\jack\java\classes
- Sous UNIX → % CLASSPATH =/home/jack/java/classes ; exporter CLASSPATH
Java