IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Copie Logique et copie physique


Sujet :

Langage Java

  1. #1
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut Copie Logique et copie physique
    Bonjour,

    j'utilise une classe qui représente une structure arborescente. Avant d'entrer dans une boucle je sauve mon arbre pour qu'il ne soit pas modifié dans cette boucle mais à priori je ne dois pas effectuer de copie physique de ma structure car elle est bien modifiée.

    voici les champs de ma classe ModuleTree :
    public class ModuleTree {
    boolean leaf = false;
    LinkedList children=new LinkedList();
    String label="";
    Vertex representant=null;
    Et voici ma fonction clone() qui est sensée me faire une copie physique d'un élément de type ModuleTree :

    public ModuleTree clone(){
    ModuleTree clone = new ModuleTree();

    clone.setLeaf(this.leaf);
    clone.setChildren(this.getChildren());
    clone.setLabel(this.getLabel());
    clone.representant = this.getRepresentant();

    return clone;
    }
    Merci beaucoup pour votre aide.

  2. #2
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Par défaut
    Ta méthode "clone" effectue une <<shallow copy>> (copie en surface) de l'objet ModuleTree, c'est à dire que les mêmes attributs sont référencés (donc modifiables avec répercution) dans l'original et la copie : effectue plutôt une <<deep copy>> (copie en profondeur) en clonant également les attributs de l'objet ModuleTree.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public ModuleTree clone(){
      ModuleTree clone = this.clone();
      clone.setLeaf(this.leaf.clone());
      clone.setChildren(this.getChildren().clone());
      clone.setLabel(this.getLabel().clone());
      clone.representant = this.getRepresentant().clone();
      return clone;
    }

  3. #3
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut
    Merci de cette information, en dehors de copie logique/copie physique je ne savais pas qu'il existait une copie de surface et une copie en profondeur. Je pense qu'effectivement mon problème vient de là.

    Mais j'ai copié votre fontion et j'ai tout plein d'erreurs :

    boolean cannot be dereferenced
    clone.setLeaf(this.leaf.clone());

    setChildren(java.util.LinkedList) in ModuleTree cannot be applied to (java.lang.Object)
    clone.setChildren(this.getChildren().clone());

    clone() has protected access in java.lang.Object
    clone.setLabel(this.getLabel().clone());

    setLabel(java.lang.String) in ModuleTree cannot be applied to (java.lang.Object)
    clone.setLabel(this.getLabel().clone());

    clone() has protected access in java.lang.Object
    clone.representant = this.getRepresentant().clone();
    Il faut que je redéfinisse clone() pour tous les champs ?!

  4. #4
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public ModuleTree clone(){
      ModuleTree clone = this.clone();
      clone.setLeaf(this.leaf); // suffisant car boolean est immuable
      clone.setChildren(this.getChildren().clone()); // seule la LinkedList est clonee (pas ses elements)
      clone.setLabel(this.getLabel()); // suffisant car String est immuable
      clone.representant = this.getRepresentant().clone(); // Vertex semble etre une classe developpee pour ton projet (donc implemente sa methode "clone")
      return clone;
    }
    Dans ton cas la présence d'une java.util.List comme attribut impose à la fois de copier la liste (par un "clone") et de copier tous ses élements (par un "clone" sur chacun) : donc utilise plutôt la méthode <<clone>> de la classe <<SerializationUtils>> de l'API Jakarta Commons Lang.

  5. #5
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut
    J'ai créé la méthode clone() pour Vertex, de ce côté je pense que tout est ok. Par contre, pour la LinkedList est ce que c'est bien comme cela qu'il faut que j'utilise la méthode clone() de Class SerializationUtils :

    clone.setChildren(SerializationUtils.clone(this.getChildren()));
    Normalement c'est une classe de java.lang.Object, donc je ne pense pas à avoir à rajouter quelque chose dans mon fichier... pourtant il ne reconnait pas la méthode...

  6. #6
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import org.apache.commons.lang.SerializationUtils;
    /* import de l'API Jakarta Commons Lang (telecharger le JAR et le positionner dans le classpath) */
    public class ModuleTree implements Serializable {
      /* attributs */
      boolean leaf = false;
      LinkedList children=new LinkedList();
      String label="";
      Vertex representant=null;
      /* methodes */
      public ModuleTree clone(){
        return (ModuleTree)SerializationUtils.clone(this); // ne fonctionne pas en cas de reference sirculaire dans les attributs
      }
    }

  7. #7
    Membre éclairé Avatar de GDMINFO
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 350
    Par défaut
    Merci, je pense qu'avec tout ça je devrais m'en sortir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fichier logique et fichier physique
    Par mettahrioui dans le forum SAP
    Réponses: 2
    Dernier message: 19/10/2009, 16h28
  2. Copie DATAARA dans fichier physique
    Par AAWOOPY56 dans le forum AS/400
    Réponses: 7
    Dernier message: 08/10/2009, 13h08
  3. [PHP 5.0] fonction copy qui ne copie pas
    Par schats dans le forum Langage
    Réponses: 7
    Dernier message: 24/04/2009, 20h44
  4. Accélérer la copie avec "Tera Copy" (buffer size).
    Par byloute dans le forum Windows Vista
    Réponses: 0
    Dernier message: 06/09/2008, 10h13
  5. calculatrice de copie pour un copy shop
    Par mehdox dans le forum VB.NET
    Réponses: 4
    Dernier message: 06/11/2007, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo