stringtranslate.com

Boxeo (informática)

En informática , el boxeo (también conocido como envoltura) es la transformación de colocar un tipo primitivo dentro de un objeto para que el valor pueda usarse como referencia . Unboxing es la transformación inversa de extraer el valor primitivo de su objeto contenedor. Autoboxing es el término para aplicar automáticamente transformaciones de boxing y/o unboxing según sea necesario.

Boxeo

El uso más destacado de Boxing es en Java, donde existe una distinción entre tipos de referencia y de valor por motivos como la eficiencia del tiempo de ejecución y cuestiones de sintaxis y semántica. En Java, a solo puede almacenar valores de tipo . Se podría desear tener un of , pero esto no es directamente posible. En cambio, Java define clases contenedoras primitivas correspondientes a cada tipo primitivo : y , y , y , etc. Luego, se puede definir a usando el tipo encuadrado e insertar valores en la lista encajonándolos como objetos. (Al utilizar tipos parametrizados genéricos introducidos en J2SE 5.0, este tipo se representa como ).LinkedListObjectLinkedListintIntegerintCharactercharFloatfloatLinkedListIntegerintIntegerLinkedList<Integer>

Por otro lado, C# no tiene clases contenedoras primitivas, pero permite el boxeo de cualquier tipo de valor, devolviendo una Objectreferencia genérica. En Objective-C , cualquier valor primitivo puede tener el prefijo a @para convertirlo en un NSNumber(por ejemplo, @123o ). Esto permite agregarlos en cualquiera de las colecciones estándar, como un archivo .@(123)NSArray

Haskell tiene poca o ninguna noción del tipo de referencia , pero aún usa el término "encajonado" para la representación uniforme de unión de puntero a etiquetado del sistema de ejecución. [1]

El objeto encuadrado es siempre una copia del objeto de valor y suele ser inmutable . Al desempaquetar el objeto también se devuelve una copia del valor almacenado. El boxeo y unboxing repetidos de objetos pueden tener un impacto severo en el rendimiento, porque el boxing asigna dinámicamente nuevos objetos y el unboxing (si el valor del box ya no se usa) los hace elegibles para la recolección de basura . Sin embargo, los recolectores de basura modernos, como el recolector de basura Java HotSpot predeterminado, pueden recolectar de manera más eficiente objetos de corta duración, por lo que si los objetos en caja son de corta duración, el impacto en el rendimiento puede no ser severo.

En algunos lenguajes, existe una equivalencia directa entre un tipo primitivo sin caja y una referencia a un tipo de objeto en caja inmutable. De hecho, es posible sustituir todos los tipos primitivos de un programa por tipos de objetos encuadrados. Mientras que la asignación de una primitiva a otra copiará su valor, la asignación de una referencia a un objeto encuadrado a otra copiará el valor de referencia para hacer referencia al mismo objeto que la primera referencia. Sin embargo, esto no causará ningún problema, porque los objetos son inmutables, por lo que semánticamente no existe una diferencia real entre dos referencias al mismo objeto o a objetos diferentes (a menos que observemos la igualdad física). Para todas las operaciones distintas de la asignación, como operadores aritméticos, de comparación y lógicos, se puede desempaquetar el tipo encuadrado, realizar la operación y volver a encuadrar el resultado según sea necesario. Por tanto, es posible no almacenar ningún tipo primitivo.

autoboxing

Autoboxing es el término para obtener un tipo de referencia a partir de un tipo de valor simplemente mediante la conversión de tipos (ya sea implícita o explícita). El compilador proporciona automáticamente el código fuente adicional que crea el objeto.

Por ejemplo, en versiones de Java anteriores a J2SE 5.0, el siguiente código no se compilaba:

Entero i = nuevo entero ( 9 ); Entero i = 9 ; // error en versiones anteriores a la 5.0!        

Los compiladores anteriores a 5.0 no aceptarían la última línea. Integerson objetos de referencia, en la superficie no se diferencian de List, Object, etc. Para convertir de an inta an Integer, había que crear una instancia "manualmente" del objeto Integer. A partir de J2SE 5.0, el compilador aceptará la última línea y la transformará automáticamente para que se cree un objeto Integer para almacenar el valor 9. [2] Esto significa que, desde J2SE 5.0 en adelante, algo como , donde y son ellos mismos, se compilará ahora: a y b están sin empaquetar, los valores enteros se suman y el resultado se empaqueta automáticamente en un nuevo archivo , que finalmente se almacena dentro. variable . Los operadores de igualdad no se pueden utilizar de esta manera, porque los operadores de igualdad ya están definidos para tipos de referencia, para igualdad de las referencias; Para probar la igualdad del valor en un tipo de cuadro, aún se deben desempaquetar manualmente y comparar las primitivas, o usar el método.Integer c = a + babIntegerIntegercObjects.equals

Otro ejemplo: J2SE 5.0 permite al programador tratar una colección (como un LinkedList) como si contuviera intvalores en lugar de Integerobjetos. Esto no contradice lo dicho anteriormente: la colección todavía solo contiene referencias a objetos dinámicos y no puede enumerar tipos primitivos. No puede ser un , pero debe ser un lugar. Sin embargo, el compilador transforma automáticamente el código para que la lista reciba objetos "silenciosamente", mientras que el código fuente sólo menciona valores primitivos. Por ejemplo, el programador ahora puede escribir y pensar como si estuvieran agregados a la lista; pero el compilador habrá transformado la línea en .LinkedList<int>LinkedList<Integer>list.add(3)int 3list.add(new Integer(3))

Desembalaje automático

Con el unboxing automático, el compilador proporciona automáticamente el código fuente adicional que recupera el valor de ese objeto, ya sea invocando algún método en ese objeto o por otros medios.

Por ejemplo, en versiones de Java anteriores a J2SE 5.0, el siguiente código no se compilaba:

Entero k = nuevo entero ( 4 ); int l = k . intValor (); // siempre está bien int m = k ; // habría sido un error, pero ya está bien            

C# no admite el unboxing automático en el mismo sentido que Java, porque no tiene un conjunto separado de tipos primitivos y tipos de objetos. Todos los tipos que tienen versión primitiva y de objeto en Java son implementados automáticamente por el compilador de C# como tipos primitivos (valor) o tipos de objeto (referencia).

En ambos idiomas, el boxeo automático no se reduce automáticamente, es decir, el siguiente código no se compilará:

C#:

int yo = 42 ; objeto o = yo ; // cuadro int j = o ; // desempaquetar (error) Consola . Línea de escritura ( j ); // línea inalcanzable, el autor podría haber esperado el resultado "42"            

Java:

int yo = 42 ; Objeto o = yo ; // cuadro int j = o ; // desempaquetar (error) Sistema . afuera . imprimirln ( j ); // línea inalcanzable, el autor podría haber esperado el resultado "42"            

Escriba ayudantes

Modern Object Pascal tiene otra forma de realizar operaciones en tipos simples, cerca del boxeo, llamados ayudantes de tipos en FreePascal o ayudantes de registros en Delphi y FreePascal en modo Delphi.
Los dialectos mencionados son lenguajes de compilación nativos de Object Pascal, por lo que omiten algunas de las características que C# y Java pueden implementar. En particular, la inferencia de tipos en tiempo de ejecución en variables fuertemente tipadas.
Pero la característica está relacionada con el boxeo.
Permite al programador utilizar construcciones como

{$ifdef fpc}{$mode delphi}{$endif} usa sysutils ; // esta unidad contiene ajustes para los tipos simples var x : integer = 100 ; s : cadena ; comenzar s := x . Encadenar ; escrito ( s ) ; fin .       

Referencias

  1. ^ "7.2. Tipos sin caja y operaciones primitivas". descargas.haskell.org . Consultado el 10 de agosto de 2022 .
  2. ^ Entrada de la guía del lenguaje Java de oracle.com sobre autoboxing