Type Object
En ciencias de la computación , un tipo de objeto (también conocido como wrapping object ) es un tipo de datos que se utiliza en la programación orientada a objetos para envolver un tipo que no sea de objeto para que se vea como un objeto dinámico .
Algunos lenguajes de programación orientados a objetos hacen una distinción entre tipos de referencia y de valor , a menudo denominados objetos y no objetos en plataformas donde no existen tipos de valores complejos, por razones tales como la eficiencia del tiempo de ejecución y la sintaxis o problemas semánticos. Por ejemplo, Java tiene clases primitivas de envoltura correspondientes a cada tipo de primitiva :
Integer
y int
, Character
y char
, Float
y float
, etc. Los lenguajes como C ++ tienen poca o ninguna noción de tipo de referencia ; por lo tanto, el uso del tipo de objeto es de poco interés.BOXING
El boxeo, también conocido como envoltura, es el proceso de colocar un tipo primitivo dentro de un objeto para que la primitiva se pueda usar como un objeto de referencia. Por ejemplo, en Java, a
LinkedList
puede cambiar su tamaño, pero una matriz debe tener un tamaño fijo. Uno podría desear tener una LinkedList
de int
, pero la LinkedList
clase solo enumera las referencias a los objetos dinámicos; no puede enumerar los tipos primitivos, que son tipos de valores.
Para eludir esto,
int
se puede encasillar Integer
, que son objetos dinámicos, y luego agregar a un LinkedList
de Integer
. (Utilizando tipos parametrizados genéricos introducidos en J2SE 5.0, este tipo se representa como ). Por otro lado, C # no tiene clases primitivas de envoltura, pero permite el encajamiento de cualquier tipo de valor, devolviendo una referencia genérica . LinkedList<Integer>
Object
El objeto en caja es siempre una copia del objeto de valor, y generalmente es inmutable . Al desempaquetar el objeto, también se devuelve una copia del valor almacenado. Tenga en cuenta que el boxeo y el desempaquetado repetidos de objetos pueden tener un impacto severo en el rendimiento, ya que el boxeo asigna dinámicamente nuevos objetos y unboxing (si el valor encuadrado 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 recopilar de manera más eficiente los objetos efímeros, de modo que si los objetos encuadrados son efímeros, el impacto en el rendimiento puede no ser tan malo.
Existe una equivalencia directa entre un tipo primitivo no incluido y una referencia a un tipo de objeto encajonado inmutable. De hecho, es posible sustituir todos los tipos primitivos en un programa con 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 encapsulado a otra copiará el valor de referencia para referirse al mismo objeto que la primera referencia. Sin embargo, esto no causará ningún problema, ya que los objetos son inmutables, por lo que semánticamente no existe una diferencia real entre dos referencias al mismo objeto o a diferentes objetos (a menos que se observe la igualdad física). Para todas las operaciones que no sean de asignación, como la aritmética, la comparación y los operadores lógicos, uno puede desempaquetar el tipo en caja, realizar la operación y volver a colocar el resultado según sea necesario. Así,
Autoboxing
Autoboxing es el término para obtener un tipo de referencia de un tipo de valor solo a través de la conversión de tipo (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, no se compiló el siguiente código:
Entero i = nuevo Entero ( 9 ); Entero i = 9 ; // error en las versiones anteriores a 5.0!
Los compiladores anteriores a 5.0 no aceptarían la última línea.
Integer
son objetos de referencia, en la superficie no es diferente de List
, Object
y así sucesivamente. Para convertir de una int
a una Integer
, había que crear una instancia "manual" del objeto Entero. A partir de J2SE 5.0, el compilador aceptará la última línea y la transformará automáticamente para que se cree un objeto entero para almacenar el valor 9
. [1] Esto significa que, desde J2SE 5.0 en adelante, se compilará algo así como , where y are yourself, a y b se desempaquetarán, los valores enteros se sumarán, y el resultado se autoboxeará en uno nuevo , que finalmente se almacenará en el interior variableInteger c = a + b
a
b
Integer
Integer
c
. Tenga en cuenta que los operadores de igualdad no se pueden usar de esta manera, ya que los operadores de igualdad ya están definidos para los tipos de referencia, para la igualdad de las referencias; para probar la igualdad del valor en un tipo encuadrado, todavía se deben destrabar manualmente y comparar las primitivas, o usar el método. Objects.equals
Otro ejemplo: J2SE 5.0 permite que el programador trate una colección (como a
LinkedList
) como si contuviera int
valores en lugar de Integer
objetos. Esto no contradice lo que se dijo anteriormente: la colección todavía contiene referencias a objetos dinámicos y no puede listar 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 solo menciona valores primitivos. Por ejemplo, el programador ahora puede escribir y pensar como si se hubieran agregado a la lista; pero, el compilador realmente habrá transformado la línea en .
LinkedList<int>
LinkedList<Integer>
list.add(3)
int
3
list.add(new Integer(3))
Unboxing
Unboxing se refiere a obtener el valor que está asociado a un objeto dado, solo a través de la conversión de tipo (implícita o explícita). 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, no se compiló el siguiente código:
Entero k = nuevo Entero ( 4 );
int l = k . intValue (); // siempre está bien
int m = k ; // habría sido un error, pero ahora está bien
C # no admite el unboxing automático en el mismo sentido que Java, ya que no tiene un conjunto separado de tipos primitivos y tipos de objetos. Todos los tipos que tienen versiones tanto primitiva como de objeto en Java, son implementados automáticamente por el compilador C # como tipos primitivos (valor) o tipos de objeto (referencia).
En ambos idiomas, el boxeo automático no se despliega automáticamente, es decir, el siguiente código no se compilará:
DO#:
int i = 42 ;
objeto o = i ; // box
int j = o ; // unbox (error)
Consola . WriteLine ( j ); // línea inalcanzable, el autor podría haber esperado la salida "42"
Java:
int i = 42 ;
Objeto o = i ; // box
int j = o ; // unbox (error)
Sistema . a cabo . println ( j ); // línea inalcanzable, el autor podría haber esperado la salida "42"
Types Helpers
Objeto moderno Pascal tiene otra forma de realizar operaciones en tipos simples, cerca del boxeo, llamados type helpers en FreePascal o ayudantes de registro en Delphi y FreePascal en modo Delphi.
Tenga en cuenta que los dialectos mencionados son compilaciones de Object Pascal a idiomas nativos y omite algunas de las características que C # y Java pueden implementar. Notablemente, inferencia de tipo de tiempo de ejecución en variables fuertemente tipadas.
Pero la función está relacionada con el boxeo.
Permite al programador usar construcciones como:
Tenga en cuenta que los dialectos mencionados son compilaciones de Object Pascal a idiomas nativos y omite algunas de las características que C # y Java pueden implementar. Notablemente, inferencia de tipo de tiempo de ejecución en variables fuertemente tipadas.
Pero la función está relacionada con el boxeo.
Permite al programador usar construcciones como:
{$ ifdef fpc} {$ modo delphi} {$ endif} usa sysutils ; // esta unidad contiene wraps para los tipos simples var x : integer = 100 ; s : cadena ; comenzar s : = x . ToString ; writeln ( s ) ; final .
Grupo C#
Luis Rodriguez C.I23.606.837
Ivan Roca C.i 20.597.427