Saltar al contenido

¿Cómo funciona el auto boxing/unboxing en Java?

Entiende el código correctamente antes de aplicarlo a tu trabajo y si tdeseas aportar algo puedes compartirlo con nosotros.

Solución:

En caso de duda, compruebe el código de bytes:

Integer n = 42;

se convierte en:

0: bipush        42
2: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1      

Así que en realidad, valueOf() se usa en lugar del constructor (y lo mismo ocurre con las otras clases contenedoras). Esto es beneficioso ya que permite el almacenamiento en caché y no fuerza la creación de un nuevo objeto en cada operación de boxing.

El reverso es el siguiente:

int n = Integer.valueOf(42);

que se convierte en:

0: bipush        42
2: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: invokevirtual #22                 // Method java/lang/Integer.intValue:()I
8: istore_1      

es decir intValue() se usa (nuevamente, es análogo para los otros tipos de envoltura también). Esto es realmente todo lo que se reduce al auto (des) boxeo.

Puede leer acerca de las conversiones boxing y unboxing en JLS §5.1.7 y JLS §5.1.8, respectivamente.

Esta confusión se puede aclarar usando un interruptor de javac -XD-impresión plana lo cual es muy útil en casos como este. Entonces, para desentrañar el misterio de boxing y unboxing, puede escribir un programa simple como el siguiente:

import java.util.*;

public class Boxing
  public static void main(String[] args)
    Double d1 = 10.123;
    Float  f1 = 12.12f;
    Long   l1 = 1234L;
    Integer i1 = 55555;
    Short   s1 = 2345;
    Byte    b1 = 89;

    double d2 = d1;
    float  f2 = f1;
    long   l2 = l1;
    int    i2 = i1;
    short  s2 = s1;
    byte   b2 = b1;
  
 

y ahora compilamos el archivo anterior como:

javac -XD-printflat -d src/ Boxeo.java

la salida de este comando es un archivo Java con todo el azúcar sintáctico (Tipos genéricos, bucle for mejorado y, en este caso, boxing-unboxing, etc.) eliminado. siguiente es la salida

import java.util.*;

public class Boxing 

    public Boxing() 
        super();
    

    public static void main(String[] args) 
        Double d1 = Double.valueOf(10.123);
        Float f1 = Float.valueOf(12.12F);
        Long l1 = Long.valueOf(1234L);
        Integer i1 = Integer.valueOf(55555);
        Short s1 = Short.valueOf(2345);
        Byte b1 = Byte.valueOf(89);
        double d2 = d1.doubleValue();
        float f2 = f1.floatValue();
        long l2 = l1.longValue();
        int i2 = i1.intValue();
        short s2 = s1.shortValue();
        byte b2 = b1.byteValue();
    

así es como java hace el desempaquetado del boxeo. utilizando los métodos valueOf y ***Value.

Recuerda que puedes comunicar esta reseña si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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