Je passais par les constructeurs de copie, j'ai parcouru les liens dans la pile au-dessus du flux et d'autres aussi. Mais je ne suis pas clair sur les points suivants.
Je veux dire quelle est la situation ou le scénario exact dont nous aurions besoin pour utiliser Copy Constructor. Quelqu'un peut-il expliquer avec un exemple ou indiquer des liens afin que je puisse les parcourir et les comprendre en clair.
Voici les liens que j'ai parcourus pour comprendre ce qu'est un constructeur de copie.
http://www.programmerinterview.com/index.php/Java-questions/how-copy-constructors-work/
https://deepeshdarshan.wordpress.com/2013/12/05/copy-constructors-in-Java/
Le deuxième lien explique "pourquoi" et "où" le constructeur de copie doit être utilisé. Mais je ne suis toujours pas clair là-dessus.
Ci-dessous est ma classe Employee.Java
package com.test;
/**
* @author avinashd
*
*/
public class Employee {
private String rollNo;
private String name;
//constructor
public Employee(String rollNo, String name){
this.rollNo = rollNo;
this.name = name;
}
//copy constructor
public Employee(Employee employee){
this.rollNo = employee.rollNo;
this.name = employee.name;
}
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Le constructeur de copie est utilisé pour créer et copier exactement un objet avec les mêmes valeurs qu'un objet existant.
Supposons par exemple que nous avons un employé dont les valeurs sont rollNo: 1
et name: avinash
. Le constructeur de copie créerait un objet similaire avec des valeurs telles que rollNo: 1
et name: avinash
. Mais les deux sont deux objets différents et les modifications apportées aux valeurs de on object n'affecteront pas un autre objet.
La question ici est
Quand nous avons un constructeur tel que
public Employee(String rollNo, String name){
this.rollNo = rollNo;
this.name = name;
}
pour créer un objet. Nous pouvons appeler le même constructeur pour créer un autre objet. Mais pourquoi devons-nous appeler le constructeur de copie. Quand devons-nous l'appeler?. S'il vous plaît, expliquez
Il y a 2 bonnes raisons d'utiliser un constructeur de copie au lieu que le constructeur passe tous les paramètres:
Les constructeurs de copie, par convention, devraient fournir une copie complète des objets. Comme déjà mentionné par d'autres réponses, la principale commodité offerte par les constructeurs de copie est lorsque votre objet devient trop complexe. Notez que Java.lang.Cloneable
fournit une déclaration (presque) similaire.
Mais il y a un certain nombre d'avantages à utiliser des constructeurs de copie sur l'interface Cloneable
.
Cloneable
en tant qu'interface ne fournit aucune méthode. Pour qu'il soit efficace, vous devez toujours remplacer la méthode clone
de Java.lang.Object
. C'est tout à fait une utilisation contre-intuitive d'une interface.
clone
renvoie un Object
. Pour qu'il soit utile, vous devez toujours transtyper. Cela est gênant et peut entraîner des erreurs d'exécution.
La méthode clone
est mal documentée. Pour clone
, les choses peuvent être gâchées si vous avez des champs finaux pointant vers des objets mutables.
Plus important encore, les constructeurs de copie peuvent accepter et copier en profondeur des instances de sous-classes. OMI, c'est là que les constructeurs de copie brillent vraiment.
Il y a plus d'avantages (voir Joshua Bloch Effective Java 2e) mais ce sont les points que j'ai trouvés les plus pertinents pour ce sur quoi j'ai travaillé jusqu'à présent.
[1] Rien dans le langage Java fournit en fait une construction par défaut pour la copie en profondeur. Tout au plus, les objets peuvent simplement dire aux programmeurs qu'ils peuvent être copiés en profondeur, par exemple, en implémentant Cloneable
ou fournir un constructeur de copie.
Que faire si vous voulez avoir une autre instance Employee
avec exactement les mêmes valeurs que celle que vous avez déjà?.
Voulez-vous appeler?
setName(oldEmployee.getName())..
setRollNumber(oldEmployee.getRollNumber())..
etc..
Au lieu de cela, utilisez ceci
Employee copyOfEmployeeOne=new Employee(employeeOneInstance);
// no need of a sequence of setters..
Un autre cas serait le stockage de valeurs "historiques" d'objets.
Vous avez donc un seul objet, mais chaque fois que vous changez son état, vous voulez l'ajouter à ArrayList
ou à la structure de données qui vous convient le mieux, au lieu de faire une copie manuelle des données, vous utilisez simplement "constructeur de copie" avant toute modification.
Les constructeurs de copie nous offrent de nombreux avantages par rapport à la méthode Object.clone () car ils
En savoir plus sur Java Cloning - Copy Constructor versus Cloning
Grâce au constructeur de copie, nous pouvons faire du clonage sans utiliser des choses beaucoup plus complexes comme l'implémentation de l'interface Cloneable et la méthode de clonage de remplacement. De plus, nous n'avons pas à nous soucier spécialement du clonage en profondeur.
Mais les points à noter sont:
1.Lorsque nous implémentons Cloneable, c'est une indication aux autres classes/utilisateurs que les objets de cette classe peuvent être clonables. Sans cela, les autres classes peuvent ne pas avoir d'informations explicites sur le clonage.
2.Si nous rendons notre constructeur de copie privé, nous pouvons restreindre le clonage de l'objet de cette classe. Ensuite, ce constructeur de copie ne peut être utilisé que pour initialiser les objets nouvellement créés dans la classe locale plutôt que pour le clonage dans une autre classe.
3.Lorsque vous ne voulez pas rendre votre classe clonable mais si vous avez écrit un constructeur de copie avec un spécificateur d'accès public, cela conduit à l'insécurité que d'autres classes peuvent créer des objets de votre classe.
Copy Constructors implémente un mécanisme de clonage superficiel et profond, mais les principaux avantages de l'utilisation du constructeur de copie par rapport au clonage (à l'aide de l'interface Cloneable) sont les suivants: