GWT Data Binding (1/3) : introduction et Deferred Binding
Ce tutorial a pour but d’expliquer le fonctionnement du Deferred Binding de GWT et de l’utilisation de la classe Generator pour créer des classes dynamiquement. L’exemple qui nous permettra d’illustrer ce tutorial est la création d’une classe utilitaire permettant d’accéder aux données contenues dans un objet à partir de leurs noms. Cette fonctionnalité est très pratique dans les problématiques de liaisons automatiques du modèle aux IHMs (data binding).
Deferred Binding
En Java, la réflexion est un mécanisme très puissant. Supposons que l’on ait les classes Employe
et Visiteur
qui sont des sous-classes de la classe Personne
et que l’on veuille qu’un objet personne désigne une instance d’Employe
ou de Visiteur
en fonction du contexte.
En Java on utilisera la réflexion comme ceci :
-
// status contient “Employe” ou “Visiteur”
-
String status = getStatus();
-
Personne personne = (Personne) Class.forName(status).newInstance();
Ainsi, l’instance désignée par l’objet personne est choisie dynamiquement en fonction de la chaîne de caractère status.
Pour plusieurs raisons, la réflexion n’est pas possible avec GWT. La première est que dans un souci d’optimisation, seul les méthodes et classes utilisées dans l’application sont traduites en JavaScript lors de la compilation. L’autre raison est qu’il n’est pas possible de charger une classe dynamiquement en JavaScript.
Pour compenser ce manque GWT possède le Deferred Binding qui consiste à effectuer l’insertion de la classe demandée à la compilation et non durant l’exécution du programme. L’appel d’une instance se fait grâce à la commande GWT.create(Classe.class)
.
Il n’est cependant pas possible d’appeler une classe en fonction d’une chaine de caractère (’Classe’) comme avec la réflexion. Le nom de la classe doit être décrit de manière litérale (Class.class
). On peut alors se questionner sur la différence entre GWT.create(Classe.class)
et new Classe()
.
La différence se situe au niveau de la compilation. L’appel new Class()
est directement traduit en JavaScript, alors que l’appel GWT.create()
passe à travers un Generator qui spécifie quelle classe doit être instanciée.