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

Collection et Stream Java Discussion :

Probleme : clonage de tableau d'objets


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut Probleme : clonage de tableau d'objets
    bonjour a tous,

    je planches depuis déjà un petit moment sur un probleme que je n'arrive pas a resoudre, je vous expose mon probleme si quelqu'un aurait une piste je suis preneur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    			public class MaClass 
    			{
    				   MonObjet [] copy_MonTabObjet;
     
    				   public void test( MonObjet [] MonTabObjet)
    				   {
    					   copy_MonTabObjet = (MonObjet[]) MonTabObjet.clone();
    					   System.out.println("original = "+MonTabObjet[0].MonNom);	
    					   System.out.println("COPY     = "+copy_MonTabObjet[0].MonNom);	
     
    					   copy_MonTabObjet[0].MonNom = "Paulo";
     
    					   System.out.println("original = "+MonTabObjet[0].MonNom);	
    					   System.out.println("COPY     = "+copy_MonTabObjet[0].MonNom);					   
     
     
     
    				   }
     
    			}
    L'execution du code source ci-dessous me donne le resulat suivant :

    original = Sebastien
    COPY = Sebastien
    original = Paulo
    COPY = Paulo

    alors que souhaiterais avoir :

    original = Sebastien
    COPY = Sebastien
    original = Sebastien
    COPY = Paulo

    est-ce quelq'un aurait une idée pour que je puisse disposé d'un "vrai clone" de mon tableau MonTabObjet de fait que je puisse modifier des données dans le tableau cloner sans modifier l'original.

    Merci d'avance pour toute vos suggestions.

    Sébastien

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Je ne crois pas que lorsque tu clone un tableau tous ses éléments le soient aussi (et je pense qu'il en est de même pour la méthode System.arraycopy() ).
    Il va te valoir boucler sur ton tableau pour cloner tes objets un par un .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut
    dans le cas ou j'ai des variables de type chaine de caracteres cela fonctionne mais si dans ma classe MonObjet j'ai des objets comment je pourrais faire ? (une idée?? je seche ..)

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par sebastien2222
    dans le cas ou j'ai des variables de type chaine de caracteres cela fonctionne mais si dans ma classe MonObjet j'ai des objets comment je pourrais faire ? (une idée?? je seche ..)
    Cela vient d'une mauvaise implémentation du clonage de tes objets.
    En effet, pour les attributs immuables (comme les Strings) il n'y a pas de problème, par contre les attributs non immuables doivent être, eux aussi, clonés.

    [edit] Tu as plus d'informations dans la Javadoc de la méthode clone() [/edit]
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut
    Cela vient d'une mauvaise implémentation du clonage de tes objets
    peux tu préciser ? je suis pas vraiment un expert (java et objet)

    si dans mon objet MonObjet j'ai un seul et unique objet nommé AutreObjet qui contient lui meme des chaines de caracteres quel serait la solution en terme d'implémentation pour que le clonage fonctionne.

    désolé pour les questions trivial mais je debute dans le "metier".

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par sebastien2222
    si dans mon objet MonObjet j'ai un seul et unique objet nommé AutreObjet qui contient lui meme des chaines de caracteres quel serait la solution en terme d'implémentation pour que le clonage fonctionne.
    Dans la méthode clone() du premier objet tu doit aussi cloner l'attribut qui est un objet (et qui doit donc être Cloneable).

    Voici un exemple :
    Considéront une famille (classe Familly) qui possède plusieurs membres (des personnes, classe Person) qui eux ont un nom et un age. Nous voulons pouvoir cloner une famille et donc que la classe Familly implemente l'interface Cloneable (et donc la méthode clone()).
    Cependant, la famille contient des personnes, il faut donc que la class Person implémente, elle aussi, l'interface Cloneable.

    Person
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Person implements Cloneable {
        private String name;
        private int age;
     
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
     
        public Object clone() {
            // on peut utiliser directement les attributs 'name' et
            // 'age' car leurs classes respectives sont immuable
            return new Person(name, age);
        }
    }
    Familly
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Familly implements Cloneable {
        private Person father;
        private Person mother;
        private ArrayList<Person> childs;
     
        public Familly(Person father, Person mother, ArrayList<Person> childs) {
            this.father = father;
            this.mother = mother;
            this.childs = childs;
        }
     
        public Object clone() {
            // on doit cloner les attributs 'father', 'mother' et 'childs' 
            // car leurs classes respectives ne sont pas immuables
            return new Familly((Person) father.clone(), (Person) mother.clone(), (ArrayList<Person>) childs.clone());
        }
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut
    bon ok je comprends ton explication par contre le type de retour de clone() n'est pas corecte ? normalement clone doit retourner un type Object alors que dans ton exemple il retourne un type Familly dans le cas de la classe famille.

    donc dans la pratique cela ne fonctionne pas ? ou alors je suis passé a coté ?

  8. #8
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    C'est faisable, mais il est vrai qu'il vaut mieux renvoyer un Object (j'ai corrigé mon post ).
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par sebastien2222
    bon ok je comprends ton explication par contre le type de retour de clone() n'est pas corecte ? normalement clone doit retourner un type Object alors que dans ton exemple il retourne un type Familly dans le cas de la classe famille.

    donc dans la pratique cela ne fonctionne pas ? ou alors je suis passé a coté ?
    Tu as le droit, depuis java 1.5, de modifier le type de retour d'une fonction dans une classe fille, à condition que le nouveau type soit un sous-type de l'"ancien" type...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut
    merci y@m's, j'en suis arrivé à la meme conclusion hier soir, merci d'avoir pris de temps pour m'expliquer tt ca et bonne journée a toi.

    A+

    Sébastien

  11. #11
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Après avoir relu la Javadoc, je me suis rendu compte que mes implémentations de la méthode clone() ne respectaient pas les conventions .
    Voici un code beaucoup plus juste :

    Person.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class Person implements Cloneable {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Object clone() {
            Object o = null;
            try {
              // On récupère l'instance à renvoyée par l'appel de la 
              // méthode super.clone()
              o = super.clone();
            } catch(CloneNotSupportedException cnse) {
              // Ne devrait jamais arriver car nous implémentons 
              // l'interface Cloneable
              cnse.printStackTrace(System.err);
            }
            // on renvoie le clone
            return o;
        }
    }
    Familly.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Familly implements Cloneable {
        private Person father;
        private Person mother;
        private ArrayList<Person> childs;
    
        public Familly(Person father, Person mother, ArrayList<Person> childs) {
            this.father = father;
            this.mother = mother;
            this.childs = childs;
        }
    
        public Object clone() {
           Familly familly = null;
            try {
              // On récupère l'instance à renvoyée par l'appel de la 
              // méthode super.clone()
              familly = (Familly) super.clone();
            } catch(CloneNotSupportedException cnse) {
              // Ne devrait jamais arriver car nous implémentons 
              // l'interface Cloneable
              cnse.printStackTrace(System.err);
            }
            // on clone les attributs de type Person car ils ne sont pas immuables
            familly.father = (Person) father.clone();
            familly.mother = (Person) mother.clone();
            // on clone l'attribut de type ArrayList car il n'est pas immuable
            familly.childs = (ArrayList<Person>) childs.clone();
            // on renvoie le clone
            return familly;
        }
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 25/04/2007, 11h36
  2. Tableau d'objets
    Par moulefrite dans le forum MFC
    Réponses: 7
    Dernier message: 15/06/2004, 14h14
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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