Comme nous utilisons Java 21 donc vous devez configurer votre Eclipse pour cela :
Dans Window > Preferences > Java > Installed JREs: vous devez ajouter Java 21 qui est disponible sur vos machines
dans le répertoire /usr/local/apps/java21
Dans Window > Preferences > Java > Compiler le niveau compiler compliance level doit être 21.
Vous avez le droit de lire le sujet jusqu'au bout, cela vous donnera une bonne idée de là où on veut aller !
Expando est une interface implantée par des records qui veulent avoir à la fois des propriétés
typées et des propriétés non typées.
L'interface est la suivante :
public interface Expando {
Map<String, Object> moreAttributes();
}
Si par exemple, on souhaite définir une
Person comme étant un
Expando, on va écrire le record suivant
record Person(String name, Map<String, Object> moreAttributes) implements Expando {
Person {
Objects.requireNonNull(name);
moreAttributes = ExpandoUtils.copyAttributes(moreAttributes, Person.class);
}
}
var john = new Person("John", Map.of("age", 32));
Le record
Person implante l'interface
Expando et possède comme deuxième composant,
le composant
moreAttributes qui permet de stocker les valeurs non typées.
Ici, une
Person possède un nom (
name) ainsi que d'autres attributs (
moreAttributes)
qui peuvent avoir n'importe quelle clé sauf "name".
La méthode
copyAttributes assure que les valeurs non typées ne peuvent pas être modifiées (en faisant une copie
si nécessaire) et aussi que les noms des attributs de la
Map ne sont pas un des noms des composants
du record. De plus, les clés et valeurs de
moreAttributes ne peuvent pas être
null.
Par exemple, il n'est pas possible de créer l'instance de
Person suivante
new Person("John", Map.of("name", "Jane"));
car
Person définit la propriété "name" comme une propriété typée donc elle ne peut pas apparaître
en tant que propriété non typée dans
moreAttributes.
Note : le composant
moreAttributes du record n'est pas considéré comme contenant une propriété typée
donc
"moreAttributes" est un nom valide en tant que clé de la
Map.
Pour la suite du sujet, on considérera que les
Expando sont toujours bien écrits, avec au niveau du record
le composant
moreAttributes défini et la méthode
copyAttributes appelée correctement
dans le constructeur.
Des tests unitaires correspondant à l'implantation sont ici :
ExpandoTest.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
ExpandoTest.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.