Welcome to Our Website

Shallow vs. Deep Copy en Java (Français)

dans cet article de mon cours Java 8 gratuit, je vais discuter de la différence entre une copie profonde et une copie peu profonde. Vous pouvez télécharger les diapositives et l’article au format PDF ici.

qu’Est-Ce une Copie?

pour commencer, je voudrais mettre en évidence ce qu’est une copie en Java. Tout d’abord, faisons la différence entre une copie de référence et une copie d’objet. Un exemplaire de référence, comme son nom l’indique, crée une copie d’une variable de référence pointant vers un objet., Si nous avons un objet Car, avec une variable myCar pointant vers lui et que nous faisons une copie de référence, nous aurons maintenant deux variables myCar, mais toujours un objet.

Exemple 1

Une copie d’objet crée une copie de l’objet lui-même. Donc, si nous copiions à nouveau notre objet car, nous créerions une copie de l’objet lui-même, ainsi qu’une deuxième variable de référence référençant cet objet copié.

Exemple 2

qu’Est Ce qu’un Objet?,

Une copie profonde et une copie superficielle sont des types de copies d’objet, mais qu’est-ce qu’un objet? Souvent, lorsque nous parlons d’un objet, nous en parlons comme d’une seule unité qui ne peut pas être décomposée davantage, comme un humble grain de café. Cependant, c’est trop simplifié.

Exemple 3

Disons que nous avons un objet Personne. Notre objet est en fait composé d’autres objets, comme vous pouvez le voir dans l’Exemple 4. Notre personne contient un objet nom et un objet adresse., Le nom à son tour, contient un FirstName et un LastName objet; L’objet Address est composé d’un objet Street et D’un objet City. Donc, quand je parle de personne dans cet article, je parle en fait de tout ce réseau d’objets.

Exemple 4

Alors pourquoi voudrions-nous copie de cet objet? Une copie d’objet, généralement appelé un clone, est créé si nous voulons modifier ou déplacer un objet, tout en préservant l’objet d’origine. Il existe de nombreuses façons de copier un objet que vous pouvez découvrir dans un autre article., Dans cet article, nous utiliserons spécifiquement un constructeur de copie pour créer nos copies.

Copie

d’Abord, parlons de la copie. Une copie superficielle d’un objet copie l’objet « principal », mais ne copie pas les objets internes. Les « objets internes » sont partagés entre l’objet d’origine et sa copie. Par exemple, dans notre objet Person, nous créerions une deuxième personne, mais les deux objets partageraient les mêmes objets Name et Address.

regardons un exemple de codage. Dans L’exemple 5, nous avons notre classe Person, qui contient un objet nom et adresse., Le constructeur copy prend l’objet originalPerson et copie ses variables de référence.

Exemple 5

Le problème avec la copie superficielle, c’est que les deux objets ne sont pas indépendants. Si vous modifiez L’objet Nom d’une personne, la modification sera reflétée dans l’autre objet personne.

appliquons ceci à un exemple. Disons que nous avons un objet personne avec une variable de référence mother; ensuite, nous faisons une copie de mother, créant un deuxième objet personne, son. Si plus tard dans le code, le fils essaie de moveOut () en modifiant son objet Address, la mère se déplace avec lui!,

Person mother = new Person(new Name(…), new Address(…));Person son = new Person(mother);son.moveOut(new Street(…), new City(…));

exemple 6

cela se produit parce que nos objets mère et fils partagent le même objet D’adresse, comme vous pouvez le voir illustré dans L’exemple 7. Lorsque nous changeons l’adresse dans un objet, cela change dans les deux!

Exemple 7

Copie

Contrairement à la copie, d’une copie en profondeur est complètement indépendant de la copie d’un objet. Si nous copiions notre objet Person, nous copierions toute la structure de l’objet.,

Exemple 8

Un changement dans l’Adresse de l’objet, une Personne ne serait pas répercutée sur l’autre objet comme vous pouvez le voir le schéma de l’Exemple 8. Si nous regardons le code dans l’exemple 9, Vous pouvez voir que nous utilisons non seulement un constructeur de copie sur notre objet Person, mais nous utilisons également des constructeurs de copie sur les objets internes.

exemple 9

En utilisant cette copie profonde, nous pouvons réessayer l’exemple mère-fils de l’exemple 6. Maintenant, le fils est capable de sortir!,

Cependant, ce n’est pas la fin de l’histoire. Pour créer une véritable copie profonde, nous devons continuer à copier tous les éléments imbriqués de L’objet Person, jusqu’à ce qu’il ne reste que des types primitifs et des « Immutables”. Regardons la classe Street pour mieux illustrer ceci:

exemple 10

L’objet Street est composé de deux variables d’instance – String name et int number. le nombre int est une valeur primitive et non un objet. C’est juste une valeur simple qui ne peut pas être partagée, donc en créant une deuxième variable d’instance, nous créons automatiquement une copie indépendante., String est un immuable. En bref, un immuable est un objet, qui, une fois créé,ne peut plus jamais être changé. Par conséquent, vous pouvez le partager sans avoir à en créer une copie profonde.

Conclusion

Pour conclure, j’aimerais parler de certaines techniques de codage que nous avons utilisé dans notre mère-fils exemple. Ce n’est pas parce qu’une copie en profondeur vous permettra de modifier les détails internes d’un objet, tels que L’objet Address, que vous devriez le faire., Cela diminuerait la qualité du code, car cela rendrait la classe Person plus fragile aux changements – chaque fois que la classe Address est modifiée, vous devrez (potentiellement) appliquer des modifications à la classe Person également. Par exemple, si la classe Address ne contient plus D’objet Street, nous devrons modifier la méthode moveOut() dans la classe Person en plus des modifications que nous avons déjà apportées à la classe Address.

dans L’exemple 6 de cet article, j’ai seulement choisi d’utiliser un nouvel objet Street and City pour mieux illustrer la différence entre une copie peu profonde et une copie profonde., Au lieu de cela, je vous recommande d’attribuer un nouvel objet Address à la place, en convertissant efficacement en un hybride d’une copie superficielle et profonde, comme vous pouvez le voir dans L’exemple 10:

Person mother = new Person(new Name(…), new Address(…));Person son = new Person(mother);son.moveOut(new Address(...));

exemple 11

en termes orientés objet, cela viole l’encapsulation, et L’Encapsulation est l’un des aspects les plus importants de la programmation Orientée Objet. Dans ce cas, j’avais violé l’encapsulation en accédant aux détails internes de l’objet Address dans notre classe Person., Cela nuit à notre code car nous avons maintenant empêtré la classe Person dans la classe Address et si nous apportons des modifications à la classe Address en cours de ligne, cela pourrait nuire à la classe Person comme je l’ai expliqué ci-dessus. Bien que vous ayez évidemment besoin d’interconnecter vos différentes classes pour avoir un projet de codage, chaque fois que vous connectez deux classes, vous devez analyser les coûts et les avantages.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *