Introducción
En este laboratorio, aprenderemos cómo crear constructores de copia en Java. Los constructores de copia se utilizan para crear un nuevo objeto utilizando los valores de un objeto existente. Los constructores de copia se pueden utilizar para crear clonaciones superficiales y profundas. Crearemos constructores de copia para clases simples y clases con tipos de referencia.
Crea una clase simple
Crea una clase simple Student con un campo name (nombre) y gpa (promedio de calificaciones). Utilizaremos esta clase para crear un constructor de copia.
class Student {
private String name;
private double gpa;
// constructor parametrizado
Student(String name, double gpa) {
this.name = name;
this.gpa = gpa;
}
}
Crea un constructor de copia para una clase simple
Crea un constructor de copia para la clase Student. El constructor de copia debe tomar un objeto de la clase como entrada y debe inicializar los campos utilizando los valores del objeto de entrada.
// Constructor de copia
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
}
// Métodos get
public String getName() {
return name;
}
public double getGpa() {
return gpa;
}
Crea un objeto y clona
Crea un objeto de la clase Student y luego crea una clonación de ese objeto utilizando el constructor de copia. Cambia el nombre del objeto original y muestra los nombres de ambos objetos para ver si el objeto clonado se vio afectado.
Student s = new Student("John", 3.5);
Student s2 = new Student(s);
s.setName("Sarah");
System.out.println("Original: " + s.getName());
System.out.println("Clone: " + s2.getName());
Crea una clase con tipos de referencia
Crea una clase Student que contiene un tipo de referencia (Address) como un campo. Utilizaremos esta clase para demostrar la diferencia entre la clonación superficial y la clonación profunda.
class Student {
private String name;
private double gpa;
private Address address;
// constructor parametrizado
Student(String name, double gpa, Address address) {
this.name = name;
this.gpa = gpa;
this.address = address;
}
}
class Address {
private int postalCode;
Address(int postalCode) {
this.postalCode = postalCode;
}
}
Crea un constructor de copia superficial
Crea un constructor de copia superficial para la clase Student. El constructor de copia superficial solo debe asignar referencias a los campos de tipo de referencia.
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
this.address = s.getAddress();
}
Demuestra la clonación superficial
Crea un objeto Student y luego un clon utilizando el constructor de copia superficial. Cambia el código postal de la dirección del objeto original y muestra ambos códigos postales para demostrar que el objeto clonado se ve afectado por los cambios en el original.
Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);
s.getAddress().setPostalCode(54321);
System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());
Crea un constructor de copia profunda
Crea un constructor de copia profunda para la clase Student. El constructor de copia profunda debe crear nuevos objetos para los campos de tipo de referencia.
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
this.address = new Address(s.getAddress().getPostalCode());
}
// getters
public Address getAddress() {
return address;
}
Demuestra la clonación profunda
Crea un objeto Student y luego un clon utilizando el constructor de copia profunda. Cambia el código postal de la dirección del objeto original y muestra ambos códigos postales para demostrar que el objeto clonado no se ve afectado por los cambios en el original.
Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);
s.getAddress().setPostalCode(54321);
System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());
Resumen
En este laboratorio, aprendimos cómo crear constructores de copia en Java. Los constructores de copia se pueden utilizar para crear clonaciones profundas y superficiales de objetos. También comparamos los constructores de copia con el método clone() y discutimos cuestiones de herencia con los constructores de copia. Crear constructores de copia es una forma elegante y simple de clonar objetos.



