Java 1.5 Usar autoboxing o métodos valueOf para mejorar el rendimiento (Ventajas)

Java 1.5 vino con varias mejoras en el lenguaje. Entre ellas autoboxing y autounboxing. ¿Y para que sirve? si tienes que usar un objeto "wrapper" para meter enteros en una lista por ejemplo, en vez de usar new Integer(numero), usas directamente número. Entonces imaginemos que queremos meter 3 números en una lista, en Java 1.4 se haría así:

List lista = new ArrayList();

lista.add( new Integer( 1));
lista.add( new Integer( 2));
lista.add( new Integer( 3));

En Java 1.5 se haría así:

List <Integer> lista = new ArrayList<Integer>();

lista.add( 1);
lista.add( 2);
lista.add( 3);

El compilador se encarga de crear los objetos wrapper por uno.

Esta característica pareciera sólo cosmética, es decir, que sólo serviría para poner el código más bonito. Pero resulta que por dentro tiene una optimización.

Las clases wrapper en Java 1.5 ahora tienen unos métodos llamados valueOf. Que simplemente reciben un número y devuelven la clase wrapper correspondiente. Bueno resulta que cuando java hace autoboxing no usa los constructores (new Integer) sino los métodos valueOf. La ventaja de estos métodos es que guardan un caché de instancias de números más usados (-127..128). en general rara vez los números pasan de ese rengo. Como las clases wrapper son inmutables no importa tener la misma instancia para todos los Integer que representen el número 1. Así en vez de tener innumerables instancias de Integer que embasuren la memoria y enlentezcan el Garbage Collector(ya que en su mayoría son objetos que tienen muy corta vida) y que además todos representen el mismo número, se tenga una única instancia por cada número distinto.

En resumen, usar el autoboxing no sólo hace más sencillo el código, sino que además es más eficiente en cuanto al consumo de memoria se refiere.

Si no se quiere usar el autoboxing porque puede ser confuso, al menos deberían usarse los métodos valueOf. El código anterior quedaría así:

List <Integer> lista = new ArrayList<Integer>();

lista.add( Integer.valueOf( 1));
lista.add( Integer.valueOf( 2));
lista.add( Integer.valueOf( 3));
Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

Acelerar la compilación de GWT durante la fase de desarrollo

GWT es una tecnología de google que permite escribir páginas web como si fueran aplicaciones desktop en Java. Para lograr ésto, GWT se vale de un compilador que lee código fuente escrito en Java y lo transforma o lo traduce en código JavaScript.

Aunque GWT trae una herramienta para depurar el código (llamado Hosted Mode) usando la característica de debugger que tienen los IDE de Java. Es necesario de tanto en tanto, ver la aplicación montada en el entorno real, es decir, dentro de la aplicación web en un navegador. Este proceso de compilación de código Java a JavaScript es bastante lento, midiéndose en minutos cuando se trata de aplicaciones web grandes. Este factor se agrava cuando se usa la internacionalización y la aplicación web se tiene que ver en varios idiomas.

Resulta que el compilador genera una versión distinta del código para cada idioma y para cada navegador de los soportados. Entre los navegadores está (ie, firefox 1, firefox 2 en adelante, opera y safari). Cuando se está en pleno desarrollo, normalmente las pruebas se hacen en un sólo navegador y en un sólo idioma.

Lo bueno es que GWT permite configurar ésto, reduciendo dramáticamente el tiempo de compilación y por ende el tiempo de espera hasta que la aplicación está completamente desplegada. Para hacer ésto se debe agregar la siguiente línea en el archivo xml que define cada módulo que tiene definido un punto de entrada:
<module>
 <inherits name="com.google.gwt.user.User"></inherits>

 <set-property name="user.agent" value="gecko1_8"></set-property>
</module>

Esto hace que sólo se compile para Firefox 2 en adelante. Los valores permitidos para esta propiedad son:
ie8, gecko1_8, safari, ie9, ie10

Pero ojo sólo se puede poner un valor a la vez. Es decir todo o uno.

Si se tienen definidos varios idiomas se debe dejar uno sólo:
<module>
  <inherits name="com.google.gwt.user.User"></inherits>
  <inherits name="com.google.gwt.i18n.I18N"></inherits>

  <!-- Spanish -->
  <extend-property name="locale" values="es"></extend-property>

  <!-- English language, independent of country -->
  <!--<extend-property name="locale" values="en">-->
</module>

En mi aplicación el tiempo de compilación se redujo a la mitad.

Es importante recordar arreglar estos valores para el deploy final de la aplicación, especialmente si se publicará en internet.

Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

Búsqueda

Síguenos