Si Generic System est avant tout un système de représentation, il devient aussi grâce au paramétrage statique un système comportemental. Nous allons utiliser un paramétrage statique pour gérer un stock de téléphones.
Création de l’interface de gestion
Cette interface étend Snapshot et offre la possibilité d’ajouter ou de supprimer un téléphone, ainsi que de récupérer la liste de tous les téléphones :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
@SuppressWarnings("unchecked") public interface SimpleCRUD extends Snapshot<String> { @Override default Stream<String> get() { return ((Generic) this).getInstances().get().map(x -> (String) x.getValue()); } default void add(T value) { ((Generic) this).setInstance(value); } default List<T> getValues() { return get().collect(Collectors.toList()); } default boolean remove(String value) { for (Generic instance : ((Generic) this).getInstances()) { if (Objects.equals(value, instance.getValue())) { instance.remove(); return true; } } return false; } } |
Bien que l’interface SimpleCRUD n’étende pas Generic, elle possède un comportement augmenté. Par exemple, this peut être casté en Generic :
1 2 3 4 5 |
@Override @SuppressWarnings("unchecked") default Stream<String> get() { return ((Generic) this).getInstances().get().map(x -> (String) x.getValue()); } |
1 2 |
@SystemGeneric public class Phone implements SimpleCRUD {} |
Création du stock de téléphones
Nous pouvons désormais créer notre stock de téléphones. On crée un nouvel Engine en lui spécifiant la classe de notre modèle, puis on récupère la référence au modèle grâce à la méthode find() :
1 2 3 |
// Create the engine and retrieve the type Phone Engine engine = new Engine(Phone.class); Phone phone = engine.find(Phone.class); |
Ajoutons quelques téléphones à notre stock, et sauvegardons nos changements :
1 2 3 4 5 6 7 8 9 10 11 |
// Add phones phone.add("HTC Hero"); phone.add("Nokia 3310"); phone.add("Samsung Galaxy S7"); phone.add("HTC One"); // Persist changes engine.getCurrentCache().flush(); assert phone.size() == 4; assert phone.contains("HTC One"); |
Nous pouvons aussi supprimer un téléphone :
1 2 3 4 5 |
// Remove a phone phone.remove("HTC One"); assert phone.size() == 3; assert !phone.contains("HTC One"); |
Finalement, nous avons changé d’avis et décidé que ce téléphone pouvait être récupéré ! Il suffit de faire appel à la méthode clear() du cache pour annuler nos modifications depuis le dernier flush() :
1 2 3 4 5 |
// Get the current cache and clear it engine.getCurrentCache().clear(); assert phone.size() == 4; assert phone.contains("HTC One"); |
Et voilà ! En quelques lignes seulement, nous avons mis en place une interface CRUD de gestion d’un stock de téléphones grâce au paramétrage statique.
En résumé
- Tout un système peut être paramétré avec des annotations comme @SystemGeneric, @Components : c’est le paramétrage statique.
- À la création de l' Engine, il faut lui spécifier toutes les classes annotées. La méthode find de l’ Engine permet ensuite de les retrouver.
- Generic System est un système de représentation de l’information. Avec le paramétrage statique, c’est en plus un système comportemental.
Voyons dans le prochain billet la mutabilité.