Com C++, Java també admet el constructor de còpia . Però en C++ es crea per defecte. Mentre que a Java definim el nostre constructor de còpia. En aquesta secció, aprendrem el constructor de còpies a Java amb un exemple .
Constructor
A Java, a constructor és el mateix que un mètode, però l'única diferència és que el constructor té el mateix nom que el nom de la classe. S'utilitza per crear una instància de la classe. Es crida automàticament quan creem un objecte de la classe. No té cap tipus de retorn. Recordeu que un constructor no pot ser abstracte , final , sincronitzat , i estàtica . No podem anul·lar un constructor. Ocupa una mica d'espai a la memòria quan se'l crida.
Tipus de Constructors
- Constructor per defecte
- Constructor parametritzat
Excepte els dos constructors anteriors, Java també admet el constructor de còpia. Parlem-ho en detall.
Per què cal un constructor de còpia?
De vegades, ens trobem amb un problema en què hem de crear una còpia exacta d'un objecte existent de la classe. També hi ha una condició, si hem fet alguna modificació a la còpia no ha de reflectir-se en l'original i viceversa. Per a aquests casos, Java proporciona el concepte de a constructor de còpia .
Copia el constructor
A Java, un constructor de còpia és un tipus especial de constructor que crea un objecte utilitzant un altre objecte de la mateixa classe Java. Retorna una còpia duplicada d'un objecte existent de la classe.
Podem assignar un valor al camp final, però no es pot fer el mateix mentre s'utilitza el mètode clone(). S'utilitza si volem crear una còpia profunda d'un objecte existent. És més fàcil d'implementar en comparació amb el mètode clone().
Nota: les subclasses no l'hereten. Si intentem inicialitzar un objecte de classe fill a partir d'una referència de classe pare, ens enfrontem al problema de càsting quan el clonem amb el constructor de còpia.
Ús del constructor de còpies
Podem utilitzar el constructor de còpia si volem:
- Creeu una còpia d'un objecte que tingui diversos camps.
- Genereu una còpia profunda dels objectes pesats.
- Eviteu l'ús del mètode Object.clone().
Avantatges de Copy Constructor
- Si un camp es declara final, el constructor de còpia el pot canviar.
- No hi ha necessitat de tipografiar.
- El seu ús és més fàcil si un objecte té diversos camps.
- L'addició de camp a la classe és fàcil per això. Només hem de canviar al constructor de còpia.
Creació d'un constructor de còpia
Per crear un constructor de còpies a Java, seguiu els passos que s'indiquen a continuació:
- Creeu un constructor que accepti un objecte de la mateixa classe com a paràmetre.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } }
- Copieu cada objecte de camp (variable) a la instància creada recentment.
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 } }
Exemple de constructor de còpies
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()); } }
Sortida:
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
Copia el mètode del constructor vs clone().
Tant el constructor de còpia com el mètode clone() s'utilitzen per crear una còpia d'un objecte existent de la classe. Però l'ús del constructor de còpia és més fàcil i millor en comparació amb el mètode clone() per les raons que s'indiquen a continuació:
- Si estem utilitzant el mètode clone() cal importar el fitxer Clonable El mètode pot llançar l'excepció CloneNotSupportException. Per tant, gestionar l'excepció en un programa és una tasca complexa. Mentre que al constructor de còpies no hi ha aquestes complexitats.
- No podem assignar un valor si els camps ho són final . Mentre en el constructor de còpies podem assignar valors als camps finals.
- L'objecte retornat pel mètode clone() ha de ser tipografiat . Mentre que al constructor de còpies no hi ha aquest requisit.