Devrions-nous utiliser clone ou BeanUtils.copyProperties et pourquoi

À première vue, BeanUtils.copyProperties semble créer un clone d’un object. Si tel est le cas et quelles sont les préoccupations liées à l’implémentation de l’interface Cloneable (seuls les objects immuables sont nouveaux lorsque des objects mutables ont des références copiées), lequel est le meilleur et pourquoi?

Hier, j’ai implémenté clonable et ensuite réalisé que je devais fournir mes propres modifications pour les éléments non- Ssortingng / Primative . J’ai ensuite été informé de BeanUtils.copyProperties que j’utilise maintenant. Les deux implémentations semblent fournir une fonctionnalité similaire.

Merci

    Josh Bloch fournit quelques arguments assez Cloneable (y compris celui que vous avez fourni) affirmant que Cloneable est fondamentalement défectueux, favorisant plutôt un constructeur de copie. Voir ici

    Je n’ai pas encore rencontré de cas d’utilisation pratique pour copier un object immuable. Vous copiez des objects pour une raison spécifique, sans doute pour isoler un ensemble d’objects mutables dans une seule transaction en vue de leur traitement, garantissant que rien ne peut les modifier jusqu’à ce que cette unité de traitement soit complète. Si elles sont déjà immuables, une référence vaut une copie.

    BeanUtils.copyProperties est souvent un moyen moins intrusif de copier sans avoir à modifier vos classes à prendre en charge, et offre une flexibilité unique dans la composition des objects.

    Cela dit, copyProperties n’est pas toujours à taille unique. Vous devrez peut-être à un moment donné prendre en charge des objects contenant des types qui ont des constructeurs spécialisés, mais qui sont toujours mutables. Vos objects peuvent prendre en charge des méthodes internes ou des constructeurs pour contourner ces exceptions, ou vous pouvez enregistrer des types spécifiques dans un outil externe pour la copie, mais il ne peut pas atteindre certains endroits que même clone() peut utiliser. C’est bien, mais il y a toujours des limites.

    BeanUtils est plus flexible que le clone standard qui copie simplement les valeurs de champ d’un object à un autre. La méthode clone copie les champs des beans de la même classe, mais BeanUtils peut le faire pour 2 instances de classes différentes ayant les mêmes noms d’atsortingbuts.

    Par exemple, supposons que vous ayez un Bean A ayant un champ Ssortingng date et un bean B qui ont le même champ date java.util.Date. avec BeanUtils, vous pouvez copier la valeur de la chaîne et la convertir automatiquement en date à l’aide de DateFormat.

    Je l’ai utilisé pour convertir un object SOAP en objects Hibernate qui n’ont pas les mêmes types de données.

    Je pense que vous cherchez une copie profonde. vous pouvez avoir la méthode ci-dessous dans une classe util et l’utiliser pour tout type d’object.

     public static  T copy(T input) { ByteArrayOutputStream baos = null; ObjectOutputStream oos = null; ByteArrayInputStream bis = null; ObjectInputStream ois = null; try { baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(input); oos.flush(); byte[] bytes = baos.toByteArray(); bis = new ByteArrayInputStream(bytes); ois = new ObjectInputStream(bis); Object result = ois.readObject(); return (T) result; } catch (IOException e) { throw new IllegalArgumentException("Object can't be copied", e); } catch (ClassNotFoundException e) { throw new IllegalArgumentException("Unable to reconstruct serialized object due to invalid class definition", e); } finally { closeQuietly(oos); closeQuietly(baos); closeQuietly(bis); closeQuietly(ois); } } 

    D’après votre question, je suppose que vous avez besoin d’ une copie complète de l’object. Si tel est le cas, n’utilisez pas la méthode clone car il est déjà spécifié dans oracle docs qu’il fournit une copie superficielle de l’object associé. Et je n’ai pas assez d’idée sur l’API BeanUtils.copyProperties .
    Ci-dessous se trouve la courte démo de deep copy . Ici, je copie en profondeur un primitive array . Vous pouvez essayer ce code avec n’importe quel type d’object.

     import java.io.*; class ArrayDeepCopy { ByteArrayOutputStream baos; ByteArrayInputStream bins; public void saveState(Object obj)throws Exception //saving the stream of bytes of object to `ObjectOutputStream`. { baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); oos.close(); } public int[][] readState()throws Exception //reading the state back to object using `ObjectInputStream` { bins = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream oins = new ObjectInputStream(bins); Object obj = oins.readObject(); oins.close(); return (int[][])obj; } public static void main(Ssortingng[] args) throws Exception { int arr[][]= { {1,2,3}, {4,5,7} }; ArrayDeepCopy ars = new ArrayDeepCopy(); System.out.println("Saving state..."); ars.saveState(arr); System.out.println("State saved.."); System.out.println("Resortingeving state.."); int j[][] = ars.readState(); System.out.println("State resortingeved..And the resortingeved array is:"); for (int i =0 ; i < j.length ; i++ ) { for (int k = 0 ; k < j[i].length ; k++) { System.out.print(j[i][k]+"\t"); } System.out.print("\n"); } } } 

    clone crée une copie superficielle de l’object, l’object clone est toujours de la même classe que celui d’origine. Tous les champs, privés ou non, sont copiés.

    BeanUtils.copyProperties API Copie les valeurs de propriété du bean d’origine vers le bean de destination pour tous les cas où les noms de propriété sont identiques.

    Quant à moi, ces deux concepts ont peu de points communs.

    Le clonage est fait par vous. Si l’instance que vous essayez de cloner contient la référence d’une autre instance, vous devez également écrire le code de clonage. Que faire si les instances contiennent une chaîne de références à d’autres instances? Donc, si vous faites du clonage par vous-même, il y a des chances que vous manquiez un petit détail.

    BeanUtils.copyProperties d’autre part s’occupe de tout par elle-même. Cela réduit votre effort.