Comment implémenter Shallow Copy et Deep Copy en Java

Cet article vous fournira une connaissance détaillée et complète de Shallow Copy et Deep Copy en Java avec des exemples.

Le clonage est un processus de création d'une réplique ou d'une copie de object, méthode de clonage Java.lang.Object est utilisé pour créer une copie ou une réplique d'un objet. Les objets java qui implémentent une interface clonable peuvent utiliser la méthode clone. Dans cet article, nous discuterons de la copie peu profonde et de la copie profonde dans l'ordre suivant:



Création d'une copie d'un objet Java

Nous pouvons créer une réplique ou une copie d'objet java en



1. Création d'une copie d'objet dans un emplacement mémoire différent. C'est ce qu'on appelle une copie profonde.

2. Création d'une nouvelle référence qui pointe vers le même emplacement mémoire. Ceci est également appelé une copie peu profonde.



Copie superficielle

L'implémentation par défaut de la méthode clone crée une copie superficielle de l'objet source, cela signifie qu'une nouvelle instance de type Object est créée, elle copie tous les champs dans une nouvelle instance et retourne un nouvel objet de type 'Object'. Cet objet doit explicitement être typé dans le type d'objet de l'objet source.

java comment terminer un programme

Cet objet aura une copie exacte de tous les champs de l'objet source, y compris le type primitif et les références d'objet. Si l'objet source contient des références à d'autres objets dans le champ, la nouvelle instance n'aura que des références à ces objets, une copie de ces objets n'est pas créée. Cela signifie que si nous apportons des modifications dans une copie superficielle, les modifications seront reflétées dans l'objet source. Les deux instances ne sont pas indépendantes.

La méthode clone de la classe Object est de nature protégée, toutes les classes ne peuvent donc pas utiliser la méthode clone (). Vous devez implémenter l'interface clonable et remplacer la méthode de clonage. Si l'interface clonable n'est pas implémentée, vous obtiendrez CloneNotSupportedException.super.clone () retournera une copie superficielle selon l'implémentation dans la classe Object.



Code pour copie superficielle

package com.test class Department {String empId String grade Désignation de chaîne public Department (String empId, String grade, String désignation) {this.empId = empId this.grade = grade this.designation = désignation}} class L'employé implémente Cloneable {int id String name Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Version par défaut de la méthode clone (). Il crée une copie superficielle d'un objet. protected Object clone () lance CloneNotSupportedException {return super.clone ()}} classe publique ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Création d'un clone de emp1 et l'assignation à emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Impression de la désignation de 'emp1' System.out.println (emp1.dept.designation) // Sortie: AVP // Modification de la désignation de 'emp2' emp2.dept.designation = 'Director' // Cette modification sera reflétée dans l'original Employee 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Production:

Output-Shallow-Copy

les méthodes has de la classe scanner vous permettent

Dans l'exemple ci-dessus, nous avons une classe Employee emp1 qui a trois variables de classe id (int), name (String) et department (Department).

Nous avons maintenant cloné emp1 en emp2 pour créer une copie superficielle, après cela nous avons changé la désignation en utilisant l'objet emp2 et vérifié que les mêmes changements étaient également reflétés dans emp1.


Copie profonde

La copie profonde d'un objet aura une copie exacte de tous les champs de l'objet source comme une copie superficielle, mais contrairement à la copie pâle si l'objet source a une référence à l'objet en tant que champs, alors une réplique de l'objet est créée en appelant clone méthode. Cela signifie que les objets source et destination sont indépendants l'un de l'autre. Toute modification apportée à l'objet cloné n'aura aucun impact sur l'objet source.

Code pour Deep Copy

package com.test class Department implements Cloneable {String empId String grade String désignation public Department (String empId, String grade, String désignation) {this.empId = empId this.grade = grade this.designation = désignation} // Version par défaut du clone () méthode. protected Object clone () jette CloneNotSupportedException {return super.clone ()}} class Employee implements Cloneable {int id String name Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Remplacement de la méthode clone () pour créer une copie complète d'un objet. protected Object clone () lance CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} classe publique DeepCopyInJava {public static void main (String [] args) { Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Création d'un clone de emp1 et l'assignation à emp2 emp2 = (Employé) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Impression de la désignation de 'emp1' System.out.println (emp1.dept.designation) // Sortie: AVP / / Modification de la désignation de 'emp2' emp2.dept.designation = 'Director' // Cette modification sera reflétée dans l'original Employee 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Production:

Dans l'exemple ci-dessus de copie profonde, contrairement à la copie superficielle, les objets source et destination sont indépendants l'un de l'autre. Toute modification apportée à emp2 n'aura aucun impact sur emp1.

Différence entre copie superficielle et copie profonde

Copie superficielle Copie profonde
L'objet cloné et l'objet source ne sont pas complètement disjointsLes objets clonés et les objets source sont complètement indépendants les uns des autres.
Les modifications apportées à l'instance clonée auront un impact sur la variable de référence de l'objet sourceLes modifications apportées à l'instance clonée n'auront aucun impact sur la variable de référence de l'objet source.
La version par défaut du clone est la copie superficiellePour créer une copie complète, nous devons remplacer la méthode de clonage de la classe Object.
Une copie superficielle est préférable si les variables de classe de l'objet sont uniquement de type primitif en tant que champsUne copie complète est préférable si les variables de classe de l'objet ont des références à d'autres objets en tant que champs.
C'est relativement rapideC'est relativement lent.

Avec cela, nous arrivons à la fin de l'article Shallow Copy et Deep Copy. J'espère que vous avez compris les différentes différences entre les deux.

comment créer un jframe

Vérifiez par Edureka, une entreprise d'apprentissage en ligne de confiance avec un réseau de plus de 250 000 apprenants satisfaits répartis dans le monde entier. Le cours de formation et de certification Java J2EE et SOA d'Edureka est conçu pour les étudiants et les professionnels qui souhaitent devenir développeur Java.

Vous avez une question pour nous? Veuillez le mentionner dans la section commentaires de ce blog «Shallow Copy and Deep Copy» et nous vous répondrons dans les plus brefs délais.