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.

Búsqueda

Síguenos