2010-02-11 21 views

Respuesta

61

GWT.create es utilizado por el compilador GWT para el enlace diferido. La vinculación diferida es una característica del compilador GWT que funciona al generar muchas versiones de código en tiempo de compilación, de las cuales solo uno debe cargar un cliente en particular durante el arranque en el tiempo de ejecución.

Solo debe usar el GWT.create para aquellos casos que dependen de este caso de uso específico. Por ejemplo, al crear una clase RPC: (MyServiceAsync)GWT.create(MyService.class). En todos los demás casos, use new.

Para más información consultar la página GWT sobre la unión diferido: http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsDeferred.html

+2

Gracias por eso, entonces (en el caso básico) si la implementación no cambia para diferentes locale/navegadores, use new, si habrá múltiples implementaciones use create. – RodeoClown

+0

En realidad, puede usar 'GWT.create' cuando no usa el enlace diferido también. El compilador de GWT traducirá eso al operador 'new' si no se encuentra una regla de enlace diferido. Esto es útil cuando se crea una lib o componente con puntos de extensión para ser utilizado posteriormente por otros desarrolladores. –

28

GWT.create emplea el trabajo de encuadernación diferido para evitar la falta de soporte de reflexión.

De acuerdo con la FAQ:

vinculación diferida es la respuesta de Google Web Toolkit para la reflexión de Java.

Es más fácil explicar la vinculación diferida comenzando con un caso de uso. Cada navegador web tiene su propia idiosincrasia, generalmente muchos de ellos. (El gran número inmanejable de ellos es el problema que GWT fue creado para resolver, en primer lugar.) La forma estándar de Java de tratar con idiosincrasias sería encapsular el código personalizado en subclases, con una subclase para cada navegador compatible. En tiempo de ejecución, la aplicación usaría la reflexión y la carga de clases dinámicas para seleccionar la subclase apropiada para el entorno actual, cargar la clase, crear una instancia y luego usar esa instancia como proveedor de servicios durante la duración del programa.

Esto es de hecho lo que hace GWT. Sin embargo, el entorno JavaScript en el que finalmente se ejecutan las aplicaciones GWT simplemente no admite la carga de clases dinámica (también conocido como enlace dinámico). Ciertamente puede incluir código para admitir cada navegador en su código JavaScript generado, pero para hacerlo debe incluir soporte para todos navegadores está en el único archivo de la aplicación. ¿Por qué debería un usuario de Opera tener que descargar un código específico para Firefox, cuando no hay ninguna posibilidad de que alguna vez lo necesite?

Debido a que la vinculación dinámica no está disponible como técnica para GWT, GWT utiliza en cambio el enlace diferido. Una forma de pensar en esto es como "carga dinámica de clases que ocurre en tiempo de compilación en lugar de tiempo de ejecución". Cuando el Compilador GWT compila su aplicación Java, determina todas las "idiosincrasias" diferentes que debe admitir, y genera una versión separada y estrechamente simplificada de la aplicación para esa configuración específica. Por ejemplo, genera una versión diferente del archivo de aplicación para Firefox que lo hace para Opera.

+0

No sólo eso, sino que la mayoría de los marcos que se basan en la generación de código (no sólo de pasar por alto la falta de reflexión) utilizan el método GWT.create. –

Cuestiones relacionadas