Pregunta

He oído hablar de tipos que se denominan "en caja". en algunos idiomas

En Java, he oído hablar de "autoboxing". ¿Que es esto? ¿Tiene clases de envoltura para un tipo? ¿Cómo cambiaría mi código si estoy trabajando con tipos en caja o sin caja?

¿Fue útil?

Solución

Algunos tipos de datos se consideran "primitivos", lo que significa que no se tratan como un objeto y no tienen las propiedades de un objeto.

En la mayoría de las plataformas, los enteros y los caracteres son ejemplos de tipos que son primitivos pero pueden encuadrarse.

Encajonar significa envolverlos en un objeto para que tengan el comportamiento de un objeto.

El significado y el comportamiento exactos dependen del idioma que esté utilizando. Algunos lenguajes (como Smalltalk ... al menos desde cuando lo hacía ...) no permiten ningún tipo primitivo y consideran que todo es un objeto, pero hay una penalización de rendimiento asociada con eso porque, al final del día, el procesador necesita trabajar con números en bruto y memoria en bruto para hacer un trabajo útil. Si desea agregar dos enteros que han sido encuadrados, por ejemplo, detrás de escena, están "sin caja". en tipos primitivos, los números se agregan y luego se vuelven a encuadrar en un nuevo entero.

Otros consejos

Información más específica para Java:

Autoboxing permite que Java convierta automáticamente cosas como boolean y int a sus versiones Object Boolean y Integer automáticamente en la mayoría de los casos. También permite que ocurra lo contrario.

Por ejemplo:

int a = 3; // no boxing is happening
Integer b = 3;  // newer versions of java automatically convert the int 3 to Integer 3
int c = b;  // these same versions also automatically convert Integer 3 to int 3

Las versiones anteriores de java que no tienen autoboxing requerirán que este código haga lo mismo:

int a = 3;  // works the same
Integer b = new Integer(3);  //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive

Sin embargo, hay algunos escenarios en los que aún tiene que hacer las cosas manualmente. Por ejemplo, imagine que tiene una clase con dos métodos como este:

assertEquals(int a, int b);
assertEquals(Object a, Object b)

Ahora, si intentas hacer esto:

Integer a = 3;
int b = 3;
assertEquals(a, b);  // this will not compile

La razón por la que esto no funciona es porque no puede determinar si debería desempaquetar a en un int o box b en un Integer . Por lo tanto, es ambiguo a qué método se debe llamar la firma. Para solucionar esto, puede hacer uno de estos:

assertEquals((int) a, b);
assertEquals(a, (Integer) b);

Sí, el boxeo significa tomar un tipo de valor y envolverlo en un tipo de referencia. Desde que Java introdujo el autoboxing, puede hacer:

void foo(Object bar) {}
//...
    foo(1);

Y Java convertirá automáticamente el int 1 en un número entero. En versiones anteriores tendrías que hacer:

foo(new Integer(1));

Autoboxing es más útil en Java cuando se trabaja con genéricos, ya que no puede usar primitivas con genéricos, por lo que para almacenar entradas en una lista, tendría que hacer una List < Integer > y poner las entradas en la lista en caja.

Un tipo en caja significa que los valores se asignan en un bloque en el montón y se referencian a través de un puntero. Esto es bueno para la uniformidad en la implementación del tiempo de ejecución (hace que sea más fácil tener funciones genéricas, etc.), a costa de una indirección adicional.

Generalmente cuando trabaja con colecciones, se trata de matrices de objetos. En lenguajes como Java, hay una diferencia entre un primitivo y un objeto. Cuando un primitivo está "en caja", es esencialmente solo una envoltura alrededor de un primitivo, por lo que juega bien con el resto del marco que espera un Objeto.

Autoboxing es solo el acto de poner una primitiva en un objeto o extraer una primitiva de un objeto de manera transparente para que no tenga que preocuparse por el paso adicional de hacerlo usted mismo.

En recuadro significa que tomaron un tipo de valor regular y crearon un objeto a su alrededor. Algo así como ponerlo en una caja. En general, esto debe evitarse, debido a la sobrecarga de construir el objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top