Un poco de Unboxing, Autoboxing y Wrappers en Java

Antes de empezar es importante saber que desde Java 1.5 se permite convertir primitivos a objetos (wrappers) o viceversa de forma automática. Esto se conoce como AutoBoxing y UnBoxing.

Bien, ahora vamos a ver un ejemplo (Con truco de magia incluido) usando el operador == con objetos Wrappers (Integers) que tienen el MISMO VALOR. Recuerden que al usar el operador == la comparación se hace de primitivo a primitivo, esto quiere decir que se aplica el concepto UnBoxing a los Wrappers (Se tratan como int)

public static void main(String args[]){
        Integer int1=100;
        Integer int2=100;
        if (int1==int2)
            System.out.println("Son iguales!");
        else
            System.out.println("Son diferentes! ¿?");        
    }

El resultado es: Son iguales!

Hasta aquí no hay nada nuevo ni sorprendente y antes que me digan que prometí un poco de magia les mostrare el mismo ejemplo pero con otros valores. Ejemplo:

public static void main(String args[]){
        Integer int1=128;
        Integer int2=128;
        if (int1==int2)
            System.out.println("Son iguales!");
        else
            System.out.println("Son diferentes! ¿?");        
    }

y... Taaaaraaaan! El resultado es: Son diferentes! ¿?

Yo les prometí magia y no hay otra manera de explicarlo, en realidad si la hay, esto sucede porque el concepto de Boxing garantiza regresar el mismo valor integral del objeto únicamente en el rango -128 hasta 127, este rango es por el tamaño del valor (recordemos que al final son bytes, su rango es casualmente de -128 a 127) y la JVM lo maneja así para ahorrar memoria al momento de usar Autoboxing y UnBoxing

Pues bien no hay mas que decir hoy, es algo confuso y no importa si no lo entienden solo tengan en mente esa pequeña excepción. Por último les dejo el ejemplo de como debería hacerse la validación para evitar estos problemas.
public static void main(String args[]){
        Integer int1=150;
        Integer int2=150;
        if (int1==int2)
            System.out.println("Son iguales!");
        else
            System.out.println("Son diferentes! ¿?");
        //Forma correcta de validar
        Integer int3=150;
        Integer int4=150;
        if (int3.intValue()==int4.intValue())
            System.out.println("Son iguales!");
        else
            System.out.println("Son diferentes! ¿?");
    }

Post a Comment

Artículo Anterior Artículo Siguiente