Vous avez le droit de lire le sujet jusqu'au bout, cela vous donnera une bonne idée de là où on veut aller !
La classe
EmbedList dans le package
fr.uge.embed est une liste pour laquelle les maillons
sont fournis par l'utilisateur et embarqués (
embedded in English) dans la liste.
On crée une
EmbedList en fournissant deux fonctions, une fonction
getNext qui renvoie
le maillon suivant (ou
null) et une fonction
setNext qui change la valeur du maillon suivant.
L'idée est que l'utilisateur fournit une classe (un maillon) qui implante ces deux fonctions et la classe
EmbedList va s'occuper de gérer le chaînage pour l'utilisateur.
On pré-supposera que l'utilisateur ne changera
jamais le chaînage
(changer la valeur du champ nommé
next dans l'exemple ci-dessous)
par lui-même et utilisera toujours les méthodes de la classe
EmbedList à la place.
Comparer à une implantation classique de liste chaînée comme
LinkedList,
les valeurs stockées dans les maillons ne sont pas gérées par l'implantation de liste, mais par l'utilisateur
ce qui est plus efficace s'il y a plusieurs valeurs ou si la valeur est un type primitif
(car il n'est pas nécessaire de
boxer la valeur).
Voici un exemple d'utilisation de
EmbedList.
Dans un premier temps, l'utilisateur définit une classe maillon :
class Node {
private Node next;
private final int value;
Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node" + value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
avec une méthode qui renvoie le maillon suivant (ici
getNext)
et une méthode qui modifie le maillon suivant (ici
setNext).
La classe
EmbedList, en plus du constructeur, possède une méthode
size
qui renvoie le nombre de maillons de la liste ainsi qu'une méthode
addFirst
qui permet d'ajouter un maillon en tête de liste.
EmbedList<Node> list = new EmbedList<Node>(Node::getNext, Node::setNext);
list.addFirst(new Node(1));
list.addFirst(new Node(2));
list.addFirst(new Node(3));
System.out.println(list.size()); // 3
System.out.println(list); // [Node3, Node2, Node1]
En plus des méthodes
size et
addFirst, la classe
EmbedList
-
définit une méthode forEach(lambda) qui appelle la lambda avec chaque maillon
-
peut être parcourue en utilisant la syntaxe for(var maillon: embedList) { ... }
-
définit une méthode get(index) qui renvoie le indexième maillon
-
définit une méthode unmodifiable qui renvoie une nouvelle liste qui partage les mêmes
maillons que la liste originale et est non modifiable.
-
définit une méthode add(maillon) qui permet d'ajouter un maillon en fin de liste.
-
définit une méthode valueStream(lambda) qui renvoie un Stream des valeurs des maillons
obtenu en appliquant la lambda prise en paramètre pour chaque maillon.
Des tests unitaires correspondant à l'implantation sont ici :
EmbedListTest.java.
Note : comme on utilise les tests unitaires JUnit sans Maven, dans la configuration de votre projet, il faut ajouter
la librairie JUnit 5, soit à partir du fichier
EmbedListTest.java, en cliquant sur l'annotation
@Test et en sélectionnant le quickfix "Fixup project ...", soit en sélectionnant les "Properties" du projet
(avec le bouton droit de la souris sur le projet) puis en ajoutant la librairie JUnit 5 (jupiter) au ClassPath.