2011-02-09 22 views
7

Supongamos que estoy trabajando en exponer algunas de mis clases del lado del servidor para una aplicación GWT, pero ciertas partes se podía hacer mucho mejor uso de componentes de GWT-específica (como JSNI, por ejemplo).cómo proporcionar implementaciones específicas GWT

¿Cuáles son algunas de las técnicas para hacerlo sin ser demasiado hacky?

Por ejemplo, soy consciente de usar un subpaquete y usar la etiqueta <super-source/>, pero esto requiere que los nombres de los paquetes sean diferentes, lo que hace que eclipse se queje. La solución general en la comunidad es decirle a eclipse que lo use como carpeta de origen, pero luego eclipse se queja de que hay dos clases con el mismo nombre.

Idealmente, no sería más que una manera de mantener todo en un único árbol de código fuente, y en realidad tienen diferentes clases que se aplican las implementaciones alternativas. Esto se sentiría como un enfoque más OO.

Me gustaría agregar un sufijo a una clase como _gwt que lo hace de forma automática, y sé que podría escribir un script para hacer este tipo de transformación, pero eso es seguro.

He estado considerando utilizar las bibliotecas GIN/GUICE de Google para mis proyectos en general, y creo que podría haber algún tipo de solución allí, pero no estoy seguro ya que no lo he investigado a fondo.

¿Cuáles son algunas soluciones que ha probado en el pasado en proyectos GWT?

Respuesta

7

La forma más fácil de tener implementaciones divididas es usar código super-fuente, pero solo lo suficiente para instanciar una instancia con nombre único o despacho a un método diferente. Idealmente, la implementación de super-fuente es solo de unas pocas líneas, y no tan grave como para no poder rodarla a mano.

Para solucionar los problemas de Eclipse/javac doble mapeo y nombre de paquete, la fuente GWT utiliza dos top-level roots para el código de usuario: user/src y user/super. Por ejemplo, el paquete AutoBeans tiene una implementación dividida de cotización y evaluación JSON, one for the JVM y one for the browser.

Realmente no existe una forma no-kludgy de implementar una super-fuente, ya que esta es una función que está fuera de lo que puede especificar en el idioma. No hay nada que le permita decir "use esta implementación en este entorno" sin el uso de alguna herramienta externa.

+1

+1 para referirse a la solución de Google. Parece la mejor apuesta. Puedo utilizar esta ruta alternativa de origen como un proyecto separado, que depende del proyecto principal, y puedo, uno por uno, anular varias clases, idealmente de forma tal que se obtenga un código duplicado mínimo. –

Cuestiones relacionadas