Question

  

Possible en double:    Comment copier un objet en Java?

Je dois copier un objet en Java (à savoir copier l'objet « par valeur et non par référence » afin que le nouvel objet est non seulement une référence à l'ancienne). Je suis las de la mise en œuvre clonable et préféreraient utiliser un constructeur de copie. Cependant, la classe que je dois copie a beaucoup de variables membres qui doivent être copiés (plus de 100) afin d'ajouter un nouveau constructeur à la classe juste pour la copie (qui est seulement nécessaire dans une 1 partie de ma demande) semble être une mauvaise solution en raison de sa longueur enourmous.

Y at-il une meilleure solution? Dois-je utiliser simplement clone ()? Puis-je créer un constructeur de copie, mais plutôt que de copier tous les champs sur 1 par 1 puis-je faire pensivement? Merci.

Je fondamentalement juste besoin de créer un nouvel objet qui est le même que l'ancien, mais avec quelques (environ 10 sur 100) champs modifiés (mais je dois encore deux objects..so le nouveau ne peut pas être référence à l'ancienne). Je suis ouvert à toute suggestion.

Était-ce utile?

La solution

clone() fait un clone superficiel - il ne copie que le premier niveau des champs. Vous devriez éviter d'utiliser clone() et Cloneable, car il est très difficile de mettre en œuvre correctement, et il est très probable que quelque chose sera brisé, mais pas immédiatement visible. Voir ce que Joshua Bloch dit à ce sujet.

Si vous voulez copie complète - à savoir toute la hiérarchie de l'objet cloné, je peux suggérer deux options:

Par contre, si vous voulez une copie peu profonde - à savoir que vous voulez toujours tous vos champs copiés sur un nouvel objet, mais les champs et les champs de champs (etc ..) de points à leurs valeurs d'origine, vous pouvez utiliser BeanUtils.clone(..) (de )

A part le clonage question - ayant 100 variables membres ne sont pas un bon signe. Pensez à diviser la classe en plusieurs classes (mise à jour:.. Et plusieurs tables, à l'aide de clés étrangères Bien sûr, si cela est applicable Si ce sont vraiment des propriétés du même objet, alors tout va bien)

Autres conseils

une option peut être d'utiliser une sérialisation. Ce n'est pas le plus rapide mais probablement l'un des plus sûrs. Regardez le code sur cette site:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectputStream;
import java.io.ObjectOutputStream;

public class DeepObjectCopy {

  public static Object clone(Object copyObject) {
    try {
      ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
      ObjectOutputStream oos = new ObjectOutputStream(baos);
      oos.writeObject(copyObject);
      ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
      ObjectputStream ois = new ObjectputStream(bais);
      Object deepCopy = ois.readObject();
      return deepCopy;
    } catch (IOException e) {
      e.printStackTrace();
    } catch(ClassNotFoundException e) {
      e.printStackTrace();
    }
    return null;
  }
}

méthodes de BeanUtils sont basées sur la réflexion, de sorte qu'ils sont (relativement) lent. Il en est de dozer et d'autres outils similaires. constructeur copie est le meilleur moyen de faire votre tâche si vous n'êtes pas codant pour la plate-forme telle que Android lorsque chaque kb du code est un problème, vous devez choisir de cette façon. Si le seul problème est en train d'écrire un constructeur de copie, vous pouvez utiliser Eclipse plugins tels que JUtils .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top