Información y enlaces
Participa comentando, viendo lo que otros tienen que decir, o enlazandolo desde tu blog.
- Otros artículos
- Apagando VIAVANSI
- Programación esotérica
Autoboxing en Java5
En un post reciente en Java Lobby (http://www.javalobby.org), destapaban algo a tener en cuenta cuando usamos alegremente el autoboxing de Java5.
Para el que no lo sepa, gracias al autoboxing podemos de forma muy sencilla asignar un tipo primitivo a su Wrapper class, y viceversa. Es decir, podemos, por ejemplo, asignar un boolean a una clase Boolean.
Por ejemplo, hasta Java5 hay que hacer:
//Sin autoboxing
boolean pBool=false;
Boolean wBool=new Boolean(pBool);//boxing
boolean pBool2=wBool.booleanValue();//unboxing
Desde Java5, sin embargo, la cosa se simplifica:
//Con autoboxing
boolean pBool=false;
Boolean wBool=pBool;//autoboxing
boolean pBool2=wBool;//autounboxing
Tremenda simplificacion! …en el codigo. Obviamente esto puede tener consecuencias en el rendimiento de la aplicacion, especialmente si mezclamos tipos primitivos y objetos wrapper en exprensiones aritmeticas…. asi lo advierte Sun en su documentacion. Asi que cuidadin, que hay que usar el autoboxing con precauciones.
Pero ojo!!!, porque las precauciones que debemos tomar van mas alla de las que Sun advierte…
Cual creeis que sera el resultado de la ejecucion del siguiente codigo:
package test.absurdo;public class TestAbsurdo { /** * @param args */ public static void main(String[] args) { Integer a = 1, b = 1 ; Integer c = 130, d = 130 ; System.out.println( a == 1 ) ; // A System.out.println( a == b ) ; // B System.out.println( c == 130 ) ; // C System.out.println( c == d ) ; // D } }
- false
false
false
false - true
true
true
true - true
false
true
false - true
true
true
false
Si a mi me ponen esto en un examen de certificacion, yo diria que c)
Pero, si lo ejecutamos veremos que la correcta es la d)
Por que???
Desde luego no parece tener sentido que a==b sea true y c==d sea false.
Bien, parece ser que hay una “optimizacion” no documentada, que provoca que cualquier objeto Integer cuyo valor int se encuentre entre -127 y 127, es ‘cacheado’ como si fuese un int. Es por eso que a==b vale true aunque se trate de objetos distintos, porque son ‘cacheados’ como tipos primitivos.
Ciertamente, uno no usa mucho ‘==’ para comparar objetos, pero conviene tener estas cosas por ahi en la recamara por si algun dia nos encontramos con un corpontamiento ‘esoterico’ de nuestro codigo…
Vale, podeis quitarme un par de puntos de mi porcentaje del SCJP :-O