Pourquoi avons-nous besoin de copy constructor et quand devrions-nous utiliser copy constructor en java

Je traversais des constructeurs de copie, j'ai parcouru les liens dans stack over flow et d'autres aussi. Mais je ne suis pas clair sur les points suivants.

  1. Pourquoi avons-nous besoin d'un Constructeur de Copie
  2. Quand avons-nous besoin d'un Constructeur de Copie

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 souligner des liens afin que je puisse passer par et les comprendre en clair.

Voici les liens que j'ai traversés 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 encore, je ne suis pas clair sur elle.

Ci-Dessous est ma classe Employé.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;
    }
}

Copy Constructor est utilisé pour créer et copier exactement un objet avec les mêmes valeurs d'un objet existant.

Disons, par exemple, nous avons un Employé avec des valeurs comme rollNo: 1 et name: avinash. Le constructeur de copie créerait un objet similaire avec des valeurs comme rollNo: 1 et name: avinash . Mais les deux sont 2 objets différents et les modifications apportées aux valeurs de on object n'affecteront pas un autre objet.

La Question ici est

Lorsque nous avons un constructeur comme

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 avons-nous besoin d'appeler le constructeur de copie.Quand faut-il l'appeler ?. Veuillez expliquer

28
demandé sur soufrk 2015-03-31 09:39:50

8 réponses

Il y a 2 bonnes raisons d'utiliser un constructeur de copie au lieu du constructeur passant tous les paramètres:

  1. lorsque vous avez un objet complexe avec de nombreux attributs, c'est beaucoup plus simple d'utiliser le constructeur de copie
  2. Si vous ajoutez un attribut à votre classe, vous changez simplement le constructeur de copie pour prendre en compte ce nouvel attribut au lieu de changer chaque occurrence de l'autre constructeur
27
répondu Serge Ballesta 2018-05-14 07:34:04

Les constructeurs de copie, par convention, devraient fournir une copie profonde des objets. Comme déjà mentionné par d'autres réponses, la principale commodité fournie 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.

  1. Cloneable comme une interface ne fournit pas réellement de méthodes. Pour qu'il soit efficace, vous avez encore besoin pour remplacer la méthode clone de java.lang.Object. C'est une utilisation assez contre-intuitive pour une interface.

  2. clone retourne un Object. Pour qu'il soit utile, vous devez toujours typecast. Ceci est gênant et pourrait conduire à des erreurs d'exécution.

  3. 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.

  4. Plus important encore, les constructeurs de copie peuvent prendre des instances de copie profondes et profondes de les sous-classes. IMO, 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 que j'ai travaillé jusqu'à présent.

[1] Rien dans le langage Java ne fournit réellement une construction par défaut pour la copie profonde. Tout au plus, les objets peuvent simplement indiquer aux programmeurs qu'ils peuvent être copiés en profondeur, par exemple en implémentant Cloneable ou en fournissant un constructeur de copie.

26
répondu skytreader 2015-03-31 07:06:32

Que faire si vous voulez avoir une autre instance Employee avec exactement les mêmes valeurs que celle que vous avez déjà?.

Tu appelles?

setName(oldEmployee.getName())..
setRollNumber(oldEmployee.getRollNumber())..
etc..

Au lieu de faire cela, utilisez ceci

Employee copyOfEmployeeOne=new Employee(employeeOneInstance);
// no need of a sequence of setters..
3
répondu TheLostMind 2015-03-31 06:43:27

Un autre cas serait de stocker des valeurs "historiques" de l'objet.

Donc, vous avez un seul objet mais chaque fois que vous changez son état, vous voulez l'ajouter à ArrayList ou quelle que soit la structure de données qui vous convient le mieux, au lieu de faire une copie manuelle des données, vous utilisez simplement "copy constructor" avant d'autres modifications.

2
répondu zubergu 2015-03-31 07:04:20

Les constructeurs de copie nous donnent de nombreux avantages par rapport à L'objet.clone () méthode, certains d'entre eux sont les suivants

  1. les constructeurs de copie sont meilleurs que Object.clone() parce qu'ils
  2. Ne nous forcez pas à implémenter une interface ou à lancer une exception.
  3. ne nécessitent pas de moulages.
  4. Ne nous oblige pas à dépendre d'un mécanisme de création d'objet inconnu.
  5. N'exigent pas que la classe parent suive un contrat ou implémente quoi que ce soit.
  6. permettez-nous de modifier final Fields.
  7. nous permettent d'avoir un contrôle complet sur la création d'objets, nous pouvons y écrire notre logique d'initialisation.

Lire plus sur Java Clonage - Constructeur de Copie contre le Clonage

1
répondu Naresh Joshi 2017-01-15 18:49:07

Grâce au constructeur de copie, Nous pouvons faire du clonage sans utiliser beaucoup de choses complexes comme l'implémentation D'une interface clonable et l'écrasement de la méthode clone. Aussi, nous n'avons pas besoin de nous inquiéter spécialement du clonage profond.

Mais les points à noter sont:

1.Lorsque nous implémentons Cloneable, c'est une indication pour les autres classes/utilisateurs que les objets de cette classe peuvent être clonables. Sans cela, D'autres classes peuvent ne pas avoir d'informations explicites sur cloneable.

2.Si nous faisons notre copie constructeur comme privé, alors 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 local to 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 copy constructor avec access specifier public, cela conduit à l'insécurité que d'autres classes peuvent créer des objets de votre classe.

0
répondu Srikant M 2018-01-31 04:13:36

Copy Constructors implémente à la fois un mécanisme de Clonage superficiel et profond, mais les principaux avantages de l'utilisation du constructeur de copie par rapport au clonage (en utilisant une interface clonable) sont:

  1. Nous n'avons besoin d'aucun type de boîtier à partir de L'utilisation de L'objet.méthode clone ().
  2. Nous serons en mesure de modifier les champs finaux à des fins de copie contrairement à nous ne pouvons pas modifier ou accéder aux champs finaux en cas D'objet.clone() mécanisme.
  3. Cela nous permet d'avoir un contrôle complet sur la création d'objets, nous pouvons écrivez notre logique d'initialisation dedans.
  4. Si nous voulons cloner l'objet de notre classe qui contient la variable de référence d'une autre classe dépendante, nous n'avons pas besoin d'implémenter la méthode clone de cette classe. Simplement en initialisant notre constructeur de copie, Nous pouvons y parvenir.
0
répondu BinDev 2018-03-15 13:28:43

Contrairement à C++, Java ne fournit pas de constructeurs de copie directe. Cependant, la même action peut être réalisée au moyen de la méthode clone (), ou en passant les objets d'un constructeur donné pour copier le contenu de celui-ci. Constructeur de copie est utilisée pour créer une copie exacte d'un objet avec les mêmes valeurs d'un objet existant.

Prenons un exemple pour comprendre ceci -

Il y a une université dans laquelle 10 000 étudiants étudient et cette université doit avoir un bibliothèque.

Donc, la base de données de cette bibliothèque a besoin exactement des mêmes données de tous les étudiants individuels.

Et ici le rôle d'un constructeur de copie entre en jeu.

Qui copie les données stockées dans chaque objet students de la base de données principale vers la base de données de la bibliothèque avec presque aucune erreur.

Si nous n'utilisons pas le constructeur de copie maintenant, vous pouvez imaginer à quel point les processus sont maladroits et chronophages avec une plus grande possibilité d'erreurs.

0
répondu Anurag Prasad 2018-07-05 09:33:17