Autoboxeo y Desboxeo de Java con ejemplos

Java 1.5 introdujo una característica especial de conversión automática de tipos primitivos a la correspondiente clase Wrapper y viceversa.

Autoboxeo: La conversión automática de tipos primitivos al objeto de sus correspondientes clases de envoltura se conoce como autoboxing. Por ejemplo – conversión de int a Entero, largo a Largo, doble a Doble etc.

Desboxeo: Es el proceso inverso al del autoboxing. La conversión automática de un objeto de una clase de envoltura a su correspondiente tipo primitivo se conoce como «unboxing». Por ejemplo – conversión de Entero a int, Largo a largo, Doble a doble, etc.

Tipo primitivo Clase de envoltura booleana Booleana Bytechar Flota de caracteres Flotante Entero Largo Corto Corto Doble

¿Cuándo se hace el autoboxing y el desboxing en Java

Autoboxeo

: Veamos algunos casos con ejemplos, donde el autoboxeo ocurre.
Caso 1: Cuando un método espera un objeto de clase envolvente pero el valor que se pasa como parámetro es de tipo primitivo. Por ejemplo en el siguiente código, el método myMethod() está esperando un objeto de clase envolvente Integer, sin embargo le pasamos un tipo primitivo int. El programa funcionó bien ya que el compilador hace el autoboxing (conversión de int a Integer)

clase AutoboxingEjemplo1{ public static void myMethod(Integer num){ System.out.println(num); } public static void main(String[] args) { /* pasado int (tipo primitivo), sería * convertido a objeto entero en tiempo de ejecución */ myMethod(2); }}

Salida:

2

Caso 2: Cuando en algún momento, está asignando un valor de tipo primitivo a un objeto de su clase de envoltura. Por ejemplo: Las siguientes afirmaciones son válidas porque el compilador hace el autoboxing en tiempo de ejecución.

Integer inum = 3; //Asignando int a Integer: AutoboxingLong lnum = 32L; //Asignando long a Long: Autoboxeo

Caso 3: Cuando se trata de clases de marco de colección:

ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(11); //Autoboxing - int primitivo a IntegerarrayList.add(22); //Autoboxing

Aquí la clase ArrayList espera un objeto de clase envolvente Integer, pero estamos proporcionando int primitivo.

Desembalaje

Caso 1: El método espera un objeto entero (parámetro) pero hemos suministrado int. La conversión auotmática (desmarcado) ocurrió que convirtió a Integer en int.

class UnboxingEjemplo1{ public static void myMethod(int num){ System.out.println(num); } public static void main(String[] args) { Integer inum = new Integer(100); /* pasado el objeto de clase envoltorio Integer, se convertiría * en tipo primitivo int * en tiempo de ejecución */ myMethod(inum); }}

Salida:

100

Caso 2: Asignaciones

Integer inum = new Integer(5);int num = inum; //unboxing object to primitive conversion

Caso 3: Al tratar con las clases de colección:

ArrayList arrayList = new ArrayList()int num = arrayList.get(0); // desboxeando porque el método get devuelve un objeto Integer

¿Qué pasa entre bastidores?

En la sección anterior aprendimos cómo el compilador de Java realiza la conversión automática entre los objetos de tipo primitivo y los correspondientes Wrapper. Discutamos lo que el compilador hace realmente durante la conversión automática y la eliminación de la caja. La mejor manera de entenderlo es comparando las cosas antes de java 1.5 y después de java 1.5 (boxeo y desboxeo introducidos en java 1.5).

Autoboxeo:
Lo que vemos:

Número entero = 100;

Lo que hace el compilador (o lo que hacíamos antes de java 1.5):

Número entero = Integer.valueOf(100);

Desembalaje:
Lo que vemos:

Integer num2 = new Integer(50);int inum = num2;

Lo que hace el compilador:

Integer num2 = new Integer(50);int inum = num2.intValue();

Cosas similares suceden con las otras clases de envoltura y tipos primitivos como largo, doble, corto, etc.

Hay pocas cosas que debas cuidar:

No mezclar primitivos y objetos al hacer comparaciones. Podrías obtener resultados impredecibles para tales comparaciones. Lo mejor que puedes hacer es: comparar objeto con objeto (usando el método equals()) y comparar primitivas con primitivas (usando operadores lógicos como «==», «<” etc).

Referencia

Javadoc – Autoboxeo y Desboxeo

Rate this post

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio