Éléments de programmation objet

Paquetages

Motivation

Les visibilités public/private ne sont pas toujours suffisantes.

Exemple : les listes chaînées

public class Cellule<T> {
  private T valeur;
  private Cellule<T> suivant;
  ...
}
public class Liste<T> {
  private Cellule<T> premier;
  private Cellule<T> suivant;
  private int size;
  ...
}

Dans cet exemple, seule la classe Liste est à utiliser

Paquetage

Dans l’exemple ci-dessus, on voudrait avoir la classe Cellule maquée. Pour cela :

Le nom d’un paquetage est (comme un nom de site web à l’envers) une suite d’identifiants séparés par des .

On indique l’appartenance d’une classe à un paquetage en ajoutant, au début du fichier :

package fr.upec.l2.info.epo;

Règles concernant les paquetages

Organisation des .java et .class

Les fichiers .java d’un paquetage fr.upec.epo sont censés être placés dans le dossier epo du dossier upec du dossier fr de la racine du projet.

Les fichiers .class (contenant le bytecode des classes) d’un paquetage doivent respecter la même arborescence

Diagramme de paquetage

Ces diagrammes de paquetage permettent de mettre en évidence des erreurs de conception.

Documentation de paquetage

Importation de classes d’un autre paquetage

package fr.upec.epo;

import java.util.ArrayList;

Avec eclipse, il suffit de taper Ctrl-Shift-O (organize imports) pour importer toutes les classes utilisées et supprimer les étoiles

Création de jar

Main-Class: fr.upec.epo.Main

fr.upec.epo.Main est le nom complet de la classe et l’espace après le :** est obligatoire**

jar cvmf ../manifest.mf ../application.jar .

Interaction avec l’utilisateur

Comme le programme est lancé avec un double-clic, les interactions avec l’utilisateur doivent utiliser une fenêtre. En attendant d’apprendre à faire de vraies interfaces graphiques, il est possible de demander :

Exemple :

package fr.upec.epo;

import java.io.File;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.charset.Charset;
import java.nio.file.StandardOpenOption;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

public class JOPTest {
  public static void main(String[] args) {
    JFileChooser chooser = new JFileChooser(System.getProperty("user.dir"));
    chooser.setMultiSelectionEnabled(false);
    chooser.showOpenDialog(null);
    File file = chooser.getSelectedFile();
    String message;
    try {
      message = Charset.defaultCharset()
          .decode(FileChannel.open(file.toPath(), StandardOpenOption.READ)
              .map(MapMode.READ_ONLY, 0, file.length()))
          .toString();
      JOptionPane.showMessageDialog(null, message, file.getName(),
          JOptionPane.INFORMATION_MESSAGE);
    } catch (IOException e) {
      JOptionPane.showMessageDialog(null,
          e.getClass().getSimpleName() + ": " + e.getMessage(), "Error",
          JOptionPane.ERROR_MESSAGE);
    }
  }
}

Modules

Avec Java 9, il est possible de regrouper les paquetages en modules.

Les modules permettent de :

Déclaration d’un module

On crée un fichier module-info.java :

module nom.du.module {
  exports paquetage.public.du.module;
  exports autre.paquetage.public.du.module;
  require un.module.a.importer;
  require transitive un.autre.module.transitif.a.importer:
}

Arborescence