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ó.