Programmation 2 : Sixième cours

Arnaud Labourel

4 novembre 2019

Commentaires et documentation

Commentaires inutiles

Si un commentaire semble nécessaire, le remplacer par une méthode :

Commentaires inutiles

Les commentaires se désynchronisent souvent du code :

risque de devenir un jour :

Commentaires inutiles = répétition

Commentaires inutiles

Des commentaires qui peuvent sembler utiles :

Commentaires inutiles

On peut se passer de commentaire en rajoutant une méthode et en nommant correctement les éléments du code.

Commentaires utiles

Des commentaires pour décrire les tâches à réaliser peuvent être utiles

Commentaires utiles

Documentation ou spécification du comportement d’une méthode :

JavaDoc

JavaDoc permet de générer automatiquement une documentation du code à partir de commentaires associés aux classes, méthodes, propriétés, …

La documentation contient :

  • Une description des membres : attributs et méthodes (publics et protégés) des classes
  • Une description des classes, interfaces, …
  • Des liens permettant de naviguer entre les classes
  • Des informations sur les implémentations et extensions

Un bloc de commentaire Java commençant par /** deviendra un bloc de commentaire Javadoc qui sera inclus dans la documentation du code source.

JavaDoc

Tag Description
@author pour préciser l’auteur de la fonctionnalité
@deprecated indique que l’attribut, la méthode ou la classe
est dépréciée
@return pour décrire la valeur de retour
{@code literal} Formate literal en code
{@link reference} permet de créer un lien

Pour générer la javadoc en IntelliJ

Tools generate Javadoc

JavaDoc

Structure d’un projet et paquets

Structure d’un projet

En Java, un projet peut être découpé en paquets (package).

Les paquets permettent de :

  • associer des classes afin de mieux organiser le code
  • de créer des modules indépendants réutilisables
  • d’avoir plusieurs classes qui possèdent le même nom (du moment qu’elles ne sont pas dans le même paquet)

Un paquet (package) :

  • est une collection de classes
  • peut contenir des sous-paquets

Lors de l’exécution…

Java utilise l’arborescence de fichier pour retrouver les fichiers .class

  • Une classe (ou une interface) correspond à un fichier .class
  • Un dossier correspond à un paquet

Les .class du paquet com.univ_amu doivent :

  • être dans le sous-dossier com/univ_amu
  • le dossier com doit être à la racine d’un des dossiers du ClassPath

Le ClassPath inclut :

  • le répertoire courant
  • les dossiers de la variable d’environnement CLASSPATH
  • des archives JAR
  • des dossiers précisés sur le ligne de commande de java (-classpath path)

Lors de la compilation… (1/2)

Le mot-clé package permet de préciser le paquet des classes ou interfaces définies dans le fichier :

Java utilise l’arborescence pour retrouver le code des classes ou interfaces :

  • Une classe (ou une interface) MyClass est cherchée dans le fichier MyClass.java
  • Le fichier MyClass.java est cherché dans le dossier associé au paquet de MyClass

Lors de la compilation… (2/2)

Dans l’exemple précédent, il est donc conseillé que le fichier :

  • se nomme MyClass.java
  • se trouve dans le dossier com/univ_amu (Par défaut, la compilation crée MyClass.class dans com/univ_amu)

Utilisation d’une classe à partir d’un autre paquet

Accessibilité :

  • Seules les classes publiques sont utilisable à partir d’un autre paquet
  • Un fichier ne peut contenir qu’une seule classe publique

On peut désigner une classe qui se trouve dans un autre paquet :

Importer une classe

Vous pouvez également importer une classe :

Deux classes de deux paquets différents peuvent avoir le même nom :

  • Exemple : java.util.List et java.awt.List
  • Attention de choisir le bon import

Importer un paquet

Vous pouvez également importer toutes les classes d’un paquet :

Remarques :

  • Les classes des sous-paquets ne sont pas importées
  • Le paquet java.lang est importé par défaut

Importer des membres statiques

Depuis Java 5, il est possible d’importer directement des méthodes ou attributs de classes (static).

La syntaxe est la suivante :

Exemple :

Exemple sans import statique

Exemple d’import statique

Un exemple

Le fichier com/univ_amu/HelloWorld.java :

$ javac com/univ_amu/HelloWorld.java
$ ls com/univ_amu
HelloWorld.java HelloWorld.class
$ java com.univ_amu.HelloWorld
Hello world !

Quelques remarques

Nommage des paquets :

  • Les noms de paquets sont écrits en minuscules
  • Pour éviter les collisions, on utilise le nom du domaine à l’envers com.google.gson, com.oracle.jdbc
  • Si le nom n’est pas valide, on utilise des underscores : com.univ_amu

Fichier JAR (Java Archive) :

  • est une archive ZIP pour distribuer un ensemble de classes Java
  • contient un manifest (qui peut préciser la classe qui contient le main)
  • peut également faire partie du ClassPath
  • peut être généré en ligne de commande (jar) ou avec un IDE

Classe interne

Classe imbriquée statique

Il est possible de définir une classe à l’intérieur d’une autre (classe imbriquée ou nested class) :

Il est possible d’instancier la classe interne sans qu’une instance de LinkedList existe car elle est statique :

Classe imbriquée statique

Rappel

Une classe non-imbriquée publique (public) doit être dans un fichier portant son nom.

Interdit !

Fichier LinkedList.java

erreur à la compilation :

Remarque

Une classe imbriquée peut être publique et accessible depuis l’extérieur.

Classe imbriquée statique

Il est également possible de la rendre privée à la classe LinkedList :

Dans ce cas, seules les méthodes de LinkedList pourront l’utiliser. Notez que des méthodes statiques définies dans LinkedList peuvent également utiliser cette classe interne du fait qu’elle soit statique.

Classe imbriquée statique

Exemple d’implémentation de méthodes dans la classe LinkedList :

Classe imbriquée statique

Exemple d’utilisation de la classe précédente :

Cet exemple produit la sortie suivante :

[c][b][a]

Classe imbriquée statique

Une classe imbriquée statique ne peut accéder qu’aux attributs et méthodes statiques de la classe qui la contient :

Classe interne

En revanche, si la classe interne n’est pas statique, elle peut accéder aux champs de classe qui la contient :

Classe interne

Java insère dans l’instance de Node une référence vers l’instance de LinkedList qui a permis de la créer :

Classe interne

Il est possible d’utiliser la méthode isFirst dans LinkedList :

Classe interne

Exemple d’utilisation de la classe précédente :

Cet exemple produit la sortie suivante :

[c,true][b,false][a,false]