Como C++, Java também apoia a construtor de cópia . Mas em C++ ele é criado por padrão. Enquanto em Java, definimos nosso próprio construtor de cópia. Nesta seção, aprenderemos o copiar construtor em Java com um exemplo .
Construtor
Em Java, um construtor é o mesmo que um método, mas a única diferença é que o construtor tem o mesmo nome que o nome da classe. É usado para criar uma instância da classe. É chamado automaticamente quando criamos um objeto da classe. Não possui tipo de retorno. Lembre-se de que um construtor não pode ser abstrato , final , sincronizado , e estático . Não podemos substituir um construtor. Ocupa algum espaço na memória quando é chamado.
Tipos de construtor
- Construtor padrão
- Construtor parametrizado
Exceto pelos dois construtores acima, Java também oferece suporte ao construtor de cópia. Vamos discutir isso em detalhes.
Por que o construtor de cópias é necessário?
Às vezes, enfrentamos um problema em que precisamos criar uma cópia exata de um objeto existente da classe. Há também uma condição: se tivermos feito alguma alteração na cópia, ela não deverá refletir na original e vice-versa. Para tais casos, Java fornece o conceito de um construtor de cópia .
Copiar Construtor
Em Java, um construtor de cópia é um tipo especial de construtor que cria um objeto usando outro objeto da mesma classe Java. Ele retorna uma cópia duplicada de um objeto existente da classe.
Podemos atribuir um valor ao campo final, mas o mesmo não pode ser feito ao usar o método clone(). É usado se quisermos criar uma cópia profunda de um objeto existente. É mais fácil de implementar em comparação com o método clone().
Nota: Não pode ser herdado pelas subclasses. Se tentarmos inicializar um objeto de classe filho a partir de uma referência de classe pai, enfrentaremos o problema de conversão ao cloná-lo com o construtor de cópia.
Uso do Construtor de Cópia
Podemos usar o construtor de cópia se quisermos:
- Crie uma cópia de um objeto que possui vários campos.
- Gere uma cópia profunda dos objetos pesados.
- Evite o uso do método Object.clone().
Vantagens do Construtor de Cópia
- Se um campo for declarado como final, o construtor de cópia poderá alterá-lo.
- Não há necessidade de tipografia.
- Seu uso é mais fácil se um objeto possuir vários campos.
- A adição de campo à classe é fácil por causa disso. Precisamos mudar apenas no construtor de cópia.
Criando um Construtor de Cópia
Para criar um construtor de cópia em Java, siga as etapas abaixo:
- Crie um construtor que aceite um objeto da mesma classe como parâmetro.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } }
- Copie cada objeto de campo (variável) na instância recém-criada.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //copying each filed this.price = fruits.price; //getter this.name = fruits.name; //getter } }
Exemplo de construtor de cópia
CopyConstructorExample.java
public class Fruit { private double fprice; private String fname; //constructor to initialize roll number and name of the student Fruit(double fPrice, String fName) { fprice = fPrice; fname = fName; } //creating a copy constructor Fruit(Fruit fruit) { System.out.println(' After invoking the Copy Constructor: '); fprice = fruit.fprice; fname = fruit.fname; } //creating a method that returns the price of the fruit double showPrice() { return fprice; } //creating a method that returns the name of the fruit String showName() { return fname; } //class to create student object and print roll number and name of the student public static void main(String args[]) { Fruit f1 = new Fruit(399, 'Ruby Roman Grapes'); System.out.println('Name of the first fruit: '+ f1.showName()); System.out.println('Price of the first fruit: '+ f1.showPrice()); //passing the parameters to the copy constructor Fruit f2 = new Fruit(f1); System.out.println('Name of the second fruit: '+ f2.showName()); System.out.println('Price of the second fruit: '+ f2.showPrice()); } }
Saída:
Name of the first fruit: Ruby Roman Grapes Price of the first fruit: 399.0 After invoking the Copy Constructor: Name of the second fruit: Ruby Roman Grapes Price of the second fruit: 399.0
Método Copiar Construtor Vs clone()
Tanto o construtor de cópia quanto o método clone() são usados para criar uma cópia de um objeto existente da classe. Mas o uso do construtor de cópia é mais fácil e melhor em comparação ao método clone() pelos motivos apresentados a seguir:
- Se estivermos utilizando o método clone() é necessário importar o Clonável O método pode lançar a exceção CloneNotSupportException. Portanto, tratar a exceção em um programa é uma tarefa complexa. Enquanto no construtor de cópias não existem tais complexidades.
- Não podemos atribuir um valor se os campos forem final . Enquanto estivermos no construtor de cópia, podemos atribuir valores aos campos finais.
- O objeto retornado pelo método clone() deve ser tipográfico . Enquanto no construtor de cópias não existe tal requisito.