Devons-nous utiliser le clone ou BeanUtils.copyProperties et pourquoi
Par les regards de lui - BeanUtils.copyProperties
semble créer un clone d'un objet. Si c'est le cas, et ce avec les préoccupations autour de la mise en œuvre de la Clonable interface (Uniquement des objets immuables sont de nouvelles où que mutable objets ont des références copié) qui est le meilleur et pourquoi?
Je hier en œuvre clonable et puis j'ai réalisé que je devais fournir mes propres modifications pour les non Chaîne/Primative éléments. J'ai ensuite été informé BeanUtils.copyProperties
qui je suis maintenant en utilisant. Deux mises en œuvre semblent fournir une fonctionnalité similaire.
Grâce
- Donc, qu'est-ce que vous question exactement ?
- Devons-nous utiliser le clone ou BeanUtils.copyProperties et pourquoi
Vous devez vous connecter pour publier un commentaire.
Josh Bloch fournit assez de bons arguments (y compris celui que vous avez fourni) affirmant que
Cloneable
est viciée à la base, en faveur d'un constructeur de copie à la place. Voir ici.Je n'ai pas encore rencontré une pratique en cas d'utilisation de la copie d'un objet immuable. Vous êtes de la copie d'objets pour une raison particulière, sans doute pour isoler un certain ensemble d'objets mutables en une seule transaction pour le traitement, garantissant rien ne peut les modifier jusqu'à ce que l'unité de traitement est terminé. Si ils sont déjà immuable d'une référence est aussi bon qu'une copie.
BeanUtils.copyProperties
est souvent la moins intrusive façon de copier sans avoir à modifier vos classes pour être pris en charge, et il offre une certaine souplesse dans la composition des objets.Cela dit,
copyProperties
n'est pas toujours one-size-fits-all. Vous pouvez avoir besoin de l'appui des objets contenant des types qui ont les constructeurs, mais sont encore mutable. Vos objets peuvent soutenir les méthodes internes ou des constructeurs de travailler autour de ces exceptions, ou vous pouvez vous inscrire à des types spécifiques dans certains outil externe pour la copie, mais il ne peut pas atteindre certains endroits que mêmeclone()
peut. C'est bon, mais il a encore des limites.Josh Bloch's Effective Java
notes. Puis-je résumer que "les deux peuvent être utilisés selon senarios"? mais les deux ont des limites.BeanUtils est plus flexible que la norme de clone, qui copie simplement les valeurs de champ d'un objet à un autre. La méthode clone copie les champs de haricots de la même classe, mais BeanUtils peut le faire pour les 2 instances de classes différentes ayant les mêmes noms d'attribut.
Par exemple, supposons que vous avez un Haricot qui ont un champ Chaîne de caractères date et un haricot B, qui ont le même champ de java.util.Date de date de. avec BeanUtils vous pouvez copier la chaîne de valeur et de les convertir automatiquement à jour à l'aide de DateFormat.
Je l'ai utilisé que pour convertir un SAVON objet en mode d'Hibernation des objets qui n'ont pas les mêmes types de données.
Je pense que vous êtes à la recherche pour une copie en profondeur. vous pouvez avoir la méthode ci-dessous dans un util classe et de l'utiliser pour tout type de objct.
De votre question, je suppose que vous avez besoin copie en profondeur de l'objet . Si c'est le cas, n'utilisez pas
clone
méthode comme il est déjà indiqué dansoracle docs
qu'il fournit copie superficielle de l'objet associé. Et je n'ai pas assez d'idée surBeanUtils.copyProperties
API.Étant donné ci-dessous est la courte démo de
deep copy
. Ici, je suis profondément la copie d'unprimitive array
. Vous pouvez essayer ce code avec n'importe quel type d'objet.clone crée une copie de l'objet, le clone de l'objet est toujours de la même catégorie que celui d'origine. Tous les champs, privées ou non, sont copiés.
BeanUtils.copyProperties API Copier des valeurs de propriété à partir de l'origine de la fève à la destination bean pour tous les cas où les noms des propriétés sont les mêmes.
Comme pour moi, ces deux concepts ont peu en commun.
Le clonage est fait par vous. Si l'instance qui vous tente clone contient la référence d'un autre exemple, vous devez écrire le clonage code pour que l'un de trop.
Que faire si les instances contient la chaîne de références à d'autres instances?
Donc, si vous ne le clonage par vous-même, il ya des chances que vous risquez de manquer un détail.
BeanUtils.copyProperties sur lui de prendre soin de tout par lui-même.
Il réduit votre effort.