una tipos que polimorfismo modificadores metodos herencia ejemplos constructores clases clase atributos acceso java copy-constructor

tipos - ¿Por qué necesitamos copy constructor y cuándo debemos usar copy constructor en java?



tipos de constructores en java (7)

Estaba pasando por Copy Constructors, he pasado por los enlaces en stack over flow y otros también. Pero no tengo claro los siguientes puntos.

  1. ¿Por qué necesitamos un constructor de copias?
  2. ¿Cuándo necesitamos un constructor de copias?

Me refiero a cuál es la situación o escenario exacto que necesitaríamos para usar Copy Constructor. ¿Alguien puede explicar con un ejemplo o señalar enlaces para que pueda leerlos y comprenderlos claramente?

Los siguientes son los enlaces que he seguido para comprender qué es un constructor de copias.

http://www.programmerinterview.com/index.php/java-questions/how-copy-constructors-work/

https://deepeshdarshan.wordpress.com/2013/12/05/copy-constructors-in-java/

El segundo enlace explica "por qué" y "dónde" se va a utilizar el constructor de copias. Pero aún no lo tengo claro.

A continuación se muestra mi clase Employee.java

package com.test; /** * @author avinashd * */ public class Employee { private String rollNo; private String name; //constructor public Employee(String rollNo, String name){ this.rollNo = rollNo; this.name = name; } //copy constructor public Employee(Employee employee){ this.rollNo = employee.rollNo; this.name = employee.name; } public String getRollNo() { return rollNo; } public void setRollNo(String rollNo) { this.rollNo = rollNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

Copiar constructor se utiliza para crear y copiar con exactitud un objeto con los mismos valores de un objeto existente.

Digamos, por ejemplo, que tenemos un Empleado con valores como rollNo: 1 y name: avinash . Copy Constructor crearía un objeto similar con valores como rollNo: 1 y name: avinash . Pero ambos son 2 objetos diferentes y los cambios en los valores de on object no afectarán a otro objeto.

La pregunta aquí es

Cuando tenemos un constructor como

public Employee(String rollNo, String name){ this.rollNo = rollNo; this.name = name; }

para crear un objeto Podemos llamar al mismo constructor para crear otro objeto. Pero, ¿por qué necesitamos llamar al constructor de copias? ¿Cuándo debemos llamarlo? Por favor explique


¿Qué sucede si desea tener otra instancia de Employee con exactamente los mismos valores que ya tiene?

Vas a llamar?

setName(oldEmployee.getName()).. setRollNumber(oldEmployee.getRollNumber()).. etc..

En lugar de hacer eso, usa esto

Employee copyOfEmployeeOne=new Employee(employeeOneInstance); // no need of a sequence of setters..


A través del constructor de copia Podemos hacer clonación sin usar cosas muy complejas como implementar la interfaz clonable y sobrescribir el método de clonación. Además, no debemos preocuparnos especialmente por la clonación profunda.

Pero los puntos a tener en cuenta son:

1.Cuando implementamos Cloneable, es una indicación para otras clases / usuarios que los objetos de esta clase pueden ser clonables. Sin esto, otras clases pueden no tener información explícita sobre clonable.

2. Si hacemos que nuestro constructor de copia sea privado, podemos restringir la clonación del objeto de esta clase. Entonces, este constructor de copia solo puede usarse para inicializar objetos recién creados en local a clase en lugar de para clonar en otra clase.

3.Cuando no desee hacer que su clase se pueda clonar, pero si ha escrito un constructor de copias con un especificador de acceso público, esto genera inseguridad de que otras clases puedan crear objetos de su clase.


Copy Constructors implementa el mecanismo de clonación superficial y profunda, pero las principales ventajas de usar el constructor de copia sobre la clonación (usando la interfaz Cloneable) es:

  1. No requerimos ningún tipo de carcasa a partir del uso del método Object.clone ().
  2. Podremos modificar los campos finales para copiarlos, a diferencia de que no podemos modificar o acceder a los campos finales en el caso del mecanismo Object.clone ().
  3. Nos permite tener un control completo sobre la creación de objetos, podemos escribir nuestra lógica de inicialización en él.
  4. Si queremos clonar un objeto de nuestra clase que contiene una variable de referencia de otra clase dependiente, no necesitamos implementar el método de clonación de esa clase. Simplemente inicializando nuestro constructor de copias, podemos lograr eso.

Hay 2 buenas razones para usar un constructor de copia en lugar de que el constructor pase todos los parámetros:

  1. cuando tienes un objeto complejo con muchos atributos, es mucho más simple usar el constructor de copia
  2. si agrega un atributo a su clase, simplemente cambia el constructor de copia para tener en cuenta este nuevo atributo en lugar de cambiar cada ocurrencia del otro constructor

Los constructores de copia nos dan muchas ventajas sobre el método Object.clone () porque

  1. No nos obligue a implementar ninguna interfaz o lanzar una excepción.
  2. No requiere ningún yeso.
  3. No requiera que dependamos de un mecanismo de creación de objetos desconocido.
  4. No requiera que los padres sigan ningún contrato o implementen nada.
  5. Permítanos modificar los campos finales.
  6. Permítanos tener un control completo sobre la creación de objetos, podemos escribir nuestra lógica de inicialización en él.

Más información sobre la clonación Java: Copiar constructor versus clonación


Los constructores de copias, por convención, deberían proporcionar una copia profunda de los objetos. Como ya se mencionó en otras respuestas, la conveniencia principal que proporcionan los constructores de copias es cuando su objeto se vuelve demasiado complejo. Tenga en cuenta que java.lang.Cloneable proporciona una declaración (casi) similar.

Pero hay una serie de ventajas al usar constructores de copia sobre la interfaz Cloneable .

  1. Cloneable como interfaz en realidad no proporciona ningún método. Para que sea efectivo, aún necesita anular el método de clone de java.lang.Object . Este es un uso bastante intuitivo para una interfaz.

  2. clone devuelve un Object . Para que sea de alguna utilidad, aún necesita escribir a máquina. Esto es incómodo y podría provocar errores de tiempo de ejecución.

  3. El método de clone está poco documentado. Para el clone , las cosas pueden desordenarse si tiene campos finales que apuntan a objetos mutables.

  4. Lo que es más importante, los constructores de copias pueden admitir y copiar en profundidad instancias de subclases. OMI, aquí es donde los constructores de copias realmente brillan.

Hay más ventajas (ver Joshua Bloch''s Effective Java 2e ) pero estos son los puntos que he encontrado más relevantes para lo que he trabajado hasta ahora.

[1] Nada en el lenguaje Java en realidad proporciona una construcción predeterminada para la copia profunda. A lo sumo, los objetos pueden decirle a los programadores que pueden copiarse en profundidad, por ejemplo, implementando Cloneable o proporcionando un constructor de copia.


Otro caso sería almacenar valores "históricos" de objetos.

Por lo tanto, tiene un solo objeto, pero cada vez que cambia su estado desea agregarlo a ArrayList o cualquier estructura de datos que mejor se adapte a usted, en lugar de hacer una copia manual de los datos, simplemente use "copy constructor" antes de realizar más modificaciones.