2012-03-10 8 views
5

Tiendo a usar (o incluso usar en exceso) llaves dobles de la inicialización del objeto en GWT. Para mí, parece más legible y más declarativo.¿Cuán dañinas son las llaves dobles en GWT?

new FastMap<Object>(){{ 
    put("Value", 12); 
    put("Unit", "Kg"); 
}}; 

Antes de hoy no era consciente de que esta sintaxis no es sólo una instancia del objeto, sino también crear AnonymousInnerClass for it. Ahora me preocupa cómo GWT lidia con ellos.

  1. ¿Cómo afecta esta sintaxis al rendimiento de la ejecución?
  2. ¿Cómo afecta esta sintaxis al tamaño compilado?
  3. ¿Alguna otra cosa mala?

Tengo miles de dichas inicializaciones en mi aplicación.

+0

gran pregunta. Intenta compilar con _-style = PRETTY_, que podría arrojar algo de luz. –

Respuesta

5

Mis conclusiones. Prueba code. Estoy creando una lista única con 4 mapas con 21 elementos cada uno. Estoy midiendo el tamaño de todos los archivos JavaScript generados.Resultados:

vacío (solo código vacío para asegurarse de que el código de apoyo GWT prestados):

  • BASTANTE = 533 KB (546 602 bytes)
  • OBF = 212 KB (217 601 bytes)
  • Número de new = 167

Código sin tirantes dobles:

  • BASTANTE = 557 KB (570 682 bytes)
  • OBF = 222 KB (227 663 bytes)
  • Número de new = 171

Y mismo código con tirantes dobles:

  • BASTANTE = 567 KB (581 004 bytes)
  • OBF = 228 KB (234 089 bytes)
  • Número de new = 177

creo que los resultados son bastante auto-explicativo.

+0

Wtg, en realidad poniendo el trabajo en. –

1

En lo que se refiere a la legibilidad: Me cambiarlo a algo como esto para que sea fácil de leer:

new FastMap<Object>() 
{{ 
    put("Value", 12); 
    put("Unit", "Kg"); 
}}; 

Es sin embargo posible que desee leer this respuesta para saber más acerca de los problemas relacionados con el rendimiento.

+1

Eso no se compilará. Olvidaste el segundo par de llaves. – Jeffrey

+0

Mi mal. ¡Gracias! – beta

+1

El enlace proporcionado es sobre Java, no sobre GWT. En GWT compila el javascript sin ningún objeto. Es posible que en GWT no tenga ningún efecto de daño visible. –

1

Si acaba de definir mapas constantes de este tipo, probablemente sería mejor (tanto en velocidad a gota y la legibilidad-wise) usando Guava y ImmutableMap:

Map<Integer, Character> map = ImmutableMap.of(5, 'a', 1, 'b'); 
Map<Integer, String> largerMap = ImmutableMap.<Integer, String>builder() 
    .put(1, "a") 
    .put(2, "b"); 
    .put(5, "wisconsin") 
    .build(); 

(Son de Google , y son totalmente compatibles con GWT.)

+0

Bueno, la pregunta es sobre cualquier clase. En realidad, en la mayoría de los casos, esta es mi cabellera DSL interna. Gracias por los enlaces sobre Guava e ImmutableMap. Parece prometedor. –

2

Esto es Java estándar y es independiente de GWT. Se trata exhaustivamente en Efficiency of Java “Double Brace Initialization”?.

El mayor problema que tengo con esta sintaxis es que no entrega una instancia de FastMap, sino una subclase anónima de eso. Ese objeto no se compara como igual a una instancia equivalente de FastMap con la configuración de datos de la manera tradicional. También es probable que tenga otros problemas que no son obvios y que son menos fáciles de depurar.


El hilo here dice este

cuidado - inicialización de doble refuerzo es de aspecto atractivo, pero es órdenes de magnitud más lenta que la inicialización regular, ya que debe generar una clase anónima.

Además, la clase generada se coloca en el espacio permgen, que no es basura recolectada. El permgen es bastante pequeño por defecto, y si lo rellena, el sistema tiene una manguera.

Los uso todo el tiempo en pruebas unitarias, pero nunca en el código de producción.

+2

Pero GWT no es solo otra API de Java, sino más bien una "DSL" (en realidad no, pero déjame un comentario) que se parece a Java y se compila en el Javascript del lado del cliente. Ese proceso podría manejar DBI diferente de lo que lo manejan el compilador de Java y la JVM en tiempo de ejecución. –

+0

De acuerdo con Kevin. –

+0

@Kevin: ¡acaba de averiguar qué significaba * DBI * aparte de la interfaz de base de datos! Sí, estoy de acuerdo contigo también. Sería simple para alguien comprobar a qué compila algunas líneas de Java. – Borodin

Cuestiones relacionadas