Criando Construtores de Cópia em Java

JavaBeginner
Pratique Agora

Introdução

Neste laboratório, aprenderemos como criar construtores de cópia em Java. Construtores de cópia são usados para criar um novo objeto usando os valores de um objeto existente. Os construtores de cópia podem ser usados para criar clones rasos (shallow clones) e profundos (deep clones). Criaremos construtores de cópia para classes simples e classes com tipos referenciados.

Criar uma Classe Simples

Crie uma classe Student simples com um campo name e GPA. Usaremos esta classe para criar um construtor de cópia.

class Student {
 private String name;
 private double gpa;

 // construtor parametrizado
 Student(String name, double gpa) {
  this.name = name;
  this.gpa = gpa;
    }
}

Criar um Construtor de Cópia para uma Classe Simples

Crie um construtor de cópia para a classe Student. O construtor de cópia deve receber um objeto da classe como entrada e deve inicializar os campos usando os valores do objeto de entrada.

// Construtor de cópia
Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
}

// getters
public String getName() {
 return name;
}

public double getGpa() {
 return gpa;
}

Criar um Objeto e Clonar

Crie um objeto da classe Student e, em seguida, crie um clone desse objeto usando o construtor de cópia. Mude o nome do objeto original e imprima os nomes de ambos os objetos para ver se o objeto clonado foi afetado.

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());

Criar uma Classe com Tipos Referenciados

Crie uma classe Student que contenha um tipo referenciado (Address) como um campo. Usaremos esta classe para demonstrar a diferença entre clonagem rasa (shallow cloning) e profunda (deep cloning).

class Student {
 private String name;
 private double gpa;
 private Address address;

 // construtor 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;
    }
}

Criar um Construtor de Cópia Superficial

Crie um construtor de cópia rasa (shallow copy constructor) para a classe Student. O construtor de cópia rasa deve apenas atribuir referências aos campos de tipo referenciado.

Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
 this.address = s.getAddress();
}

Demonstrar Clonagem Superficial

Crie um objeto Student e, em seguida, um clone usando o construtor de cópia rasa. Altere o código postal do endereço do objeto original e imprima ambos os códigos postais para mostrar que o objeto clonado é afetado pelas alterações no 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());

Criar um Construtor de Cópia Profunda

Crie um construtor de cópia profunda (deep copy constructor) para a classe Student. O construtor de cópia profunda deve criar novos objetos para os campos de tipo referenciado.

Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
 this.address = new Address(s.getAddress().getPostalCode());
}

// getters
public Address getAddress() {
 return address;
}

Demonstrar Clonagem Profunda

Crie um objeto Student e, em seguida, um clone usando o construtor de cópia profunda. Altere o código postal do endereço do objeto original e imprima ambos os códigos postais para mostrar que o objeto clonado não é afetado pelas alterações no 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());

Resumo

Neste laboratório, aprendemos como criar construtores de cópia em Java. Construtores de cópia podem ser usados para criar clones profundos (deep clones) e superficiais (shallow clones) de objetos. Também comparamos construtores de cópia com o método clone() e discutimos questões de herança com construtores de cópia. Criar construtores de cópia é uma maneira elegante e simples de clonar objetos.