De base : Copie d'objets en Java.
Supposons un objet obj1
qui contient deux objets, contenuObj1 y contenuObj2 .
copie superficielle :
instance
de la même classe, copie tous les champs dans la nouvelle instance et la renvoie. Classe d'objets fournit un clone
et fournit un support pour la copie superficielle.
Copie profonde :
Une copie profonde se produit lorsque un objet est copié avec les objets auxquels il se réfère. . L'image ci-dessous montre obj1
après qu'une copie profonde ait été effectuée sur elle. Non seulement obj1
ont été copiés mais les objets qu'il contient ont également été copiés. Nous pouvons utiliser Java Object Serialization
pour faire une copie profonde. Malheureusement, cette approche présente aussi quelques problèmes( exemples détaillés ).
Problèmes possibles :
clone
est difficile à mettre en œuvre correctement.
Il est préférable d'utiliser Copie défensive , constructeurs de copie (comme la réponse de @egaga) ou Méthodes d'usine statiques .
-
Si vous avez un objet, dont vous savez qu'il a un public clone()
mais que vous ne connaissez pas le type de l'objet au moment de la compilation, alors vous avez un problème. Java possède une interface appelée Cloneable
. En pratique, nous devrions implémenter cette interface si nous voulons qu'un objet Cloneable
. Object.clone
est protégé donc nous devons contourner avec une méthode publique pour qu'elle soit accessible.
-
Un autre problème se pose lorsque nous essayons copie profonde d'un objet complexe . Supposons que le clone()
de toutes les variables d'objets membres fait également une copie profonde, c'est une hypothèse trop risquée. Vous devez contrôler le code dans toutes les classes.
Par exemple org.apache.commons.lang.SerializationUtils aura une méthode pour le clone profond en utilisant la sérialisation ( Source : ). Si nous avons besoin de cloner un haricot, il existe quelques méthodes utilitaires dans le module org.apache.commons.beanutils ( Source : ).
-
cloneBean
Clonera un bean en se basant sur les getters et setters de propriété disponibles, même si la classe du bean elle-même n'implémente pas Cloneable.
-
copyProperties
copiera les valeurs des propriétés du bean d'origine vers le bean de destination pour tous les cas où les noms des propriétés sont les mêmes.