Vous commencez à connaître notre exemple de Vehicle. Jusqu’ici, nous avons créé cet exemple dynamiquement : nous créons notre type Vehicle, nous posons dessus l’attribut Options, nous créons notre instance de Vehicle…
Mais savez-vous qu’il existe une autre manière de procéder ? Nous pouvons créer notre exemple simplement à l’aide d’annotations : c’est ce qu’on appelle le paramétrage statique.
Paramétrage dynamique
Voici l’exemple sur lequel nous allons travailler, qui a été déclaré de façon dynamique :
1 2 3 4 5 6 7 8 9 10 11 |
// Create the engine Engine engine = new Engine(); // Create the structure Generic vehicle = engine.addInstance("Vehicle"); Generic color = engine.addInstance("Color"); Generic options = vehicle.addAttribute("Options"); Generic vehicleColor = vehicle.addRelation("VehicleColor", color); // Persist changes engine.getCurrentCache().flush(); |
Paramétrage statique
Voyons maintenant comment paramétrer la même structure avec des annotations :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@SystemGeneric public class Vehicle {} @SystemGeneric public class Color {} @SystemGeneric @Components(Vehicle.class) public class Options {} @SystemGeneric @Components({ Vehicle.class, Color.class }) public class VehicleColor {} |
La déclaration d’un nouveau type est la plus simple : il suffit de déclarer une nouvelle classe, et de l’annoter @SystemGeneric. Pour la déclaration d’un attribut, il faut déclarer une nouvelle classe et l’annoter avec @Components pour indiquer sur quel Generic elle est posée. Dans notre exemple, on spécifie que l’attribut Options est posé sur le type Vehicle. Enfin, la déclaration d’une relation est très similaire à celle d’un attribut. La seule différence, c’est qu’il faut préciser l’ensemble des classes impliquées dans la relation dans l’annotation @Components. Ici, on spécifie que la relation VehicleColor relie les types Vehicle et Color.
Et voilà maintenant comment réécrire l’exemple précédent :
1 2 3 4 5 6 7 8 |
// Create the engine specifying parameterized classes Engine engine = new Engine(Vehicle.class, Options.class, Color.class, VehicleColor.class); // Retrieve annotated classes Generic vehicle = engine.find(Vehicle.class); Generic color = engine.find(Color.class); Generic options = engine.find(Options.class); Generic vehicleColor = engine.find(VehicleColor.class); |
Vous voyez l’analogie entre les deux méthodes ? On commence par créer notre Engine en lui précisant toutes les classes de notre modèle. Ensuite, on fait appel à la méthode find de Engine pour récupérer les références à nos classes annotées. Plutôt simple, non ?
En résumé
- Pour chaque Generic, il faut créer une classe.
- L’annotation @SystemGeneric spécifie que la classe correspond à un nœud du graphe statiquement paramétré.
- L’annotation @Components spécifie que la classe annotée est un composant de la (ou des) classe(s) indiquée(s) dans l’annotation.
- A la création de l' Engine, il faut spécifier toutes les classes annotées.
- La méthode find de l' Engine permet de rechercher une classe annotée.