Como C++, Java también apoya la constructor de copias . Pero en C++ se crea de forma predeterminada. Mientras que en Java definimos el constructor de copias como nuestro. En esta sección aprenderemos los copiar constructor en Java con un ejemplo .
Constructor
En Java, un constructor es lo mismo que un método pero la única diferencia es que el constructor tiene el mismo nombre que el nombre de la clase. Se utiliza para crear una instancia de la clase. Se llama automáticamente cuando creamos un objeto de la clase. No tiene tipo de devolución. Recuerde que un constructor no puede ser abstracto , final , sincronizado , y estático . No podemos anular un constructor. Ocupa algo de espacio en la memoria cuando se llama.
Tipos de constructores
- Constructor predeterminado
- Constructor parametrizado
A excepción de los dos constructores anteriores, Java también admite el constructor de copia. Discutamoslo en detalle.
¿Por qué se requiere el constructor de copias?
A veces, nos enfrentamos a un problema en el que necesitamos crear una copia exacta de un objeto existente de la clase. También existe una condición: si hemos realizado algún cambio en la copia, no debería reflejarse en el original y viceversa. Para tales casos, Java proporciona el concepto de constructor de copias .
Constructor de copias
En Java, un constructor de copia es un tipo especial de constructor que crea un objeto utilizando otro objeto de la misma clase Java. Devuelve una copia duplicada de un objeto existente de la clase.
Podemos asignar un valor al campo final, pero no se puede hacer lo mismo mientras usamos el método clone(). Se utiliza si queremos crear una copia profunda de un objeto existente. Es más fácil de implementar en comparación con el método clone().
Nota: No puede ser heredado por las subclases. Si intentamos inicializar un objeto de clase secundaria a partir de una referencia de clase principal, nos enfrentamos al problema de conversión al clonarlo con el constructor de copia.
Uso del constructor de copias
Podemos usar el constructor de copias si queremos:
- Cree una copia de un objeto que tenga varios campos.
- Genere una copia profunda de los objetos pesados.
- Evite el uso del método Object.clone().
Ventajas del constructor de copias
- Si un campo se declara como final, el constructor de la copia puede cambiarlo.
- No hay necesidad de encasillar.
- Su uso es más sencillo si un objeto tiene varios campos.
- Agregar un campo a la clase es fácil gracias a esto. Necesitamos cambiar solo en el constructor de copias.
Crear un constructor de copia
Para crear un constructor de copias en Java, siga los pasos que se indican a continuación:
- Cree un constructor que acepte un objeto de la misma clase como parámetro.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } }
- Copie cada objeto de campo (variable) en la instancia recién creada.
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 } }
Ejemplo de constructor de copias
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()); } }
Producción:
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
Copiar método Constructor Vs clone()
Tanto el constructor de copia como el método clone() se utilizan para crear una copia de un objeto existente de la clase. Pero el uso del constructor de copias es más fácil y mejor en comparación con el método clone() por las razones que se detallan a continuación:
- Si estamos usando el método clone() es necesario importar el Clonable El método puede generar la excepción. CloneNotSupportException. Entonces, manejar la excepción en un programa es una tarea compleja. Mientras que en el constructor de copias no existen tales complejidades.
- No podemos asignar un valor si los campos están final . Mientras que en el constructor de copias podemos asignar valores a los campos finales.
- El objeto devuelto por el método clone() debe ser encasillar . Mientras que en el constructor de copias no existe tal requisito.