Le but de cet exercice est se familiariser avec la notion de reflection, de record et
aussi apprendre à faire des pull request/merge request et de beaux commits.
Pour cela on souhaite écrire un code qui permet d'afficher un objet au format
JSON, par exemple pour le record
Person:
import static java.util.Objects.requireNonNull;
public record Person(String firstName, String lastName) {
public Person {
requireNonNull(firstName);
requireNonNull(lastName);
}
}
On va écrire dans la classe
JSONPRinter la méthode
toJSON
qui prend en paramètre une
Person
et renvoie une chaîne de caractères au format
JSON:
public static String toJSON(Person person) {
return """
{
"firstName": "%s",
"lastName": "%s"
}
""".formatted(person.firstName(), person.lastName());
}
Mais on veut aussi que la méthode
toJSON puisse prendre en paramètre
un
Alien et renvoie aussi une chaîne de caractères au format
JSON,
nous risqons dupliquer du code.
import static java.util.Objects.requireNonNull;
public record Alien(int age, String planet) {
public Alien {
if (age < 0) {
throw new IllegalArgumentException("negative age");
}
requireNonNull(planet);
}
}
public class JSONPrinter {
public static String toJSON(Person person) {
return """
{
"firstName": "%s",
"lastName": "%s"
}
""".formatted(person.firstName(), person.lastName());
}
public static String toJSON(Alien alien) {
return """
{
"age": %s,
"planet": "%s"
}
""".formatted(alien.age(), alien.planet());
}
public static void main(String[] args) {
var person = new Person("John", "Doe");
System.out.println(toJSON(person));
var alien = new Alien(100, "Saturn");
System.out.println(toJSON(alien));
}
}
Et si l'on doit dupliquer le code de
toJSON à chaque fois que l'on veut
transformer en
JSON un nouveau record, c'est embêtant ...
A kitten dies each time you duplicate a bug !
Pour éviter l'hécatombe, on se propose d'écrire une seule méthode
toJSON
prenant un
Record en paramètre et utilisant la réflexion (
reflection en anglais)
pour trouver les propriétés à écrire au format
JSON.