web-dev-qa-db-fra.com

Pourquoi utiliser GWT.create () au lieu de new?

Quelle est la différence entre GWT.create(SomeClass.class) et new SomeClass()?

Pourquoi voudriez-vous utiliser l'un sur l'autre?

57
RodeoClown

GWT.create est utilisé par le compilateur GWT pour la liaison différée. La liaison différée est une fonctionnalité du compilateur GWT qui fonctionne en générant de nombreuses versions de code au moment de la compilation, dont une seule doit être chargée par un client particulier lors du démarrage à l'exécution.

Vous ne devez utiliser que le GWT.create pour les cas qui dépendent de ce cas d'utilisation spécifique. Par exemple, lors de la création d'une classe RPC: (MyServiceAsync)GWT.create(MyService.class). Dans tous les autres cas, utilisez new.

Pour plus d'informations, consultez la page GWT sur la liaison différée: http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsDeferred.html

64
Hilbrand Bouwkamp

GWT.create utilise un travail de reliure différée autour pour le manque de support de réflexion.

Selon la FAQ :

La liaison différée est la réponse de Google Web Toolkit à la réflexion Java.

Il est plus facile d'expliquer la liaison différée en commençant par un cas d'utilisation. Chaque navigateur Web a ses propres particularités, généralement beaucoup d'entre elles. (Le nombre impossible à gérer est le problème que GWT a été créé pour résoudre en premier lieu.) La manière standard Java de traiter les idiosyncrasies serait d'encapsuler le code personnalisé dans des sous-classes, avec une sous-classe pour chaque navigateur pris en charge. Au moment de l'exécution, l'application utilise la réflexion et le chargement de classe dynamique pour sélectionner la sous-classe appropriée pour l'environnement actuel, charge la classe, crée une instance, puis utilise cette instance comme fournisseur de services pendant la durée du programme. .

C'est en effet ce que fait GWT. Cependant, l'environnement JavaScript dans lequel les applications GWT s'exécutent finalement ne prend tout simplement pas en charge le chargement de classe dynamique (également appelé liaison dynamique). Vous pouvez certainement inclure du code pour prendre en charge chaque navigateur dans votre code JavaScript généré, mais pour ce faire, vous devez inclure la prise en charge de tous navigateurs se trouve dans le fichier d'application unique. Pourquoi un utilisateur Opera doit-il télécharger du code spécifique à Firefox, alors qu'il n'y a aucune chance qu'il en ait besoin?)

Étant donné que la liaison dynamique n'est pas disponible en tant que technique pour GWT, GWT utilise à la place une liaison différée. Une façon de penser à cela est comme "un chargement de classe dynamique qui se produit au moment de la compilation au lieu de l'exécution". Lorsque le compilateur GWT compile votre application Java, il détermine toutes les différentes "idiosyncrasies" qu'il doit prendre en charge et génère une version distincte et étroitement rationalisée de l'application pour cette configuration spécifique. Par exemple, il génère une version différente du fichier d'application pour Firefox que pour Opera.

29
Robert Munteanu