Copia de objetos


En la programación orientada a objetos , la copia de objetos es crear una copia de un objeto existente , una unidad de datos en la programación orientada a objetos. El objeto resultante se denomina copia del objeto o simplemente copia del objeto original. La copia es básica pero tiene sutilezas y puede tener una sobrecarga significativa. Hay varias formas de copiar un objeto, más comúnmente mediante un constructor de copia o clonación . La copia se realiza principalmente para que la copia se pueda modificar o mover, o para conservar el valor actual. Si alguno de estos no es necesario, una referencia a los datos originales es suficiente y más eficiente, ya que no se produce ninguna copia.

Los objetos en general almacenan datos compuestos . Mientras que en casos simples la copia se puede realizar mediante la asignación de un objeto nuevo no inicializado y copiando todos los campos ( atributos ) del objeto original, en casos más complejos esto no da como resultado el comportamiento deseado.

El objetivo de diseño de la mayoría de los objetos es dar la apariencia de estar hechos de un bloque monolítico, aunque la mayoría no lo esté. Como los objetos se componen de varias partes diferentes, la copia se convierte en algo no trivial. Existen varias estrategias para tratar este problema.

Considere un objeto A, que contiene campos x i (más concretamente, considere si A es una cadena y x i es una matriz de sus caracteres). Existen diferentes estrategias para hacer una copia de A, denominadas copia superficial y copia profunda . Muchos lenguajes permiten la copia genérica por una o cualquiera de las estrategias, definiendo una operación de copia o operaciones separadas de copia superficial y copia profunda . [1] Tenga en cuenta que aún más superficial es usar una referencia al objeto A existente, en cuyo caso no hay un objeto nuevo, solo una referencia nueva.

La terminología de copia superficial y copia profunda data de Smalltalk -80. [2] La misma distinción es válida para comparar objetos por igualdad: básicamente, hay una diferencia entre identidad (mismo objeto) e igualdad (mismo valor), correspondiente a igualdad superficial y (1 nivel) igualdad profunda de dos referencias de objeto, pero luego además, si la igualdad significa comparar solo los campos del objeto en cuestión o desreferenciar algunos o todos los campos y comparar sus valores a su vez (por ejemplo, ¿son dos listas enlazadas iguales si tienen los mismos nodos o si tienen los mismos valores?). [ aclaración necesaria ]

Un método para copiar un objeto es la copia superficial . En ese caso, se crea un nuevo objeto B y los valores de los campos de A se copian en B. [3] [4] [5] Esto también se conoce como copia campo por campo , [6] [7] [8] copia de campo por campo o copia de campo . [9]Si el valor del campo es una referencia a un objeto (por ejemplo, una dirección de memoria), copia la referencia, por lo tanto, se refiere al mismo objeto que A, y si el valor del campo es un tipo primitivo, copia el valor del tipo primitivo. En lenguajes sin tipos primitivos (donde todo es un objeto), todos los campos de la copia B son referencias a los mismos objetos que los campos del original A. Los objetos referenciados son así compartidos , por lo que si uno de estos objetos es modificado (desde A o B), el cambio es visible en el otro. Las copias superficiales son simples y, por lo general, baratas, ya que generalmente se pueden implementar simplemente copiando los bits exactamente.


Se ha completado una copia profunda.
Se ha completado una copia profunda.