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 :

[clone] cloner également la valeur des attributs


Sujet :

Langage Java

  1. #1
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut [clone] cloner également la valeur des attributs
    Bonjour,

    j'aimerai savoir comment faire pour cloner une classe mais en dupliquant également la valeur des attributs, ce que ne fait pas la méthode "clone()".

    Merci
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  2. #2
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    On "clone" des objets et non des classes...
    Tu dois pour cela redéfinir la méthode clone pour qu'elle fasse ce que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public MonObjet clone(MonObjet B){
       MonObjet A=new MonObjet();
       A.setAttribut1(B.getAttribut1);
       //le reste du traitement
       return A;
    }


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  3. #3
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par afrikha
    On "clone" des objets et non des classes...
    Tu dois pour cela redéfinir la méthode clone pour qu'elle fasse ce que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public MonObjet clone(MonObjet B){
       MonObjet A=new MonObjet();
       A.setAttribut1(B.getAttribut1);
       //le reste du traitement
       return A;
    }

    FAUX !
    Dans ton exemple, l'attribut B n'est pas dupliqué. L'attribut A et l'attribut B référencent la même valeur.

    Moi je voudrais cloner les attributs également
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Ce que tu peut faire, c'est prendre chaque attribut de la classe à cloner et les cloner et ensuite mettre le clone de ces attributs dans le clone de la classe.

  5. #5
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Oui en gros je voulais savoir si il existait une méthode proche de la méthode clone() mais qui faisiat un clone total, c'est à dire qui duplique l'objet, ses attributs et la valeur des attributs.

    Si cela n'existe pas, j'opterai alors pour une autre facon de faire, en l'occurence redéfinir la méthode clone et cloner mes attributs un par un.
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  6. #6
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    Ah la la, je suis mal réveillé moi, mais bon ce n'est pas une raison
    Je ne vois pas d'autres solutions à part celle proposé par wichtounet.


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  7. #7
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par wichtounet
    Ce que tu peut faire, c'est prendre chaque attribut de la classe à cloner et les cloner [...]
    Le problème c'est que mon objet comporte des attributs de types différents : String ,int et des types Objet.

    Or , la classe String par exemple, n'implémente pas l'interface Cloneable, ce qui signifie que pour cloner une valeur de type String, je suis obligé de faire dériver la classe String en une classe String1 qui va implémenter la classe Cloneable et tous mes attributs de type String devront être de type String1 : extrémement lourd...
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  8. #8
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    Question stupide : Pourquoi ne pas appeler le constructeur dans la méthode clone ?


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  9. #9
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Je ne vois pas du tout l'intérêt, explique toi. (je rappele que je suis capable de cloner un objet mais pas la valeur de ses attributs)
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  10. #10
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    C'était effectivement une question stupide, tu es quand même obligé de cloner tes attributs un à un.
    Je regrette de ne pas pouvoir t'aider d'avantage


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par danyboy85
    Or , la classe String par exemple, n'implémente pas l'interface Cloneable, ce qui signifie que pour cloner une valeur de type String, je suis obligé de faire dériver la classe String en une classe String1 qui va implémenter la classe Cloneable et tous mes attributs de type String devront être de type String1 : extrémement lourd...
    Et surtout impossible : on ne peut pas étendre la classe String...


    A la rigueur tu pourrais surement passer par la Reflection pour "cloner" tous les attributs qui implémente Cloneable (et encore il me semble que ce n'est pas une condition suffisante pour que ce soit possible).
    Mais bien sûr cela ne marchera pas avec les objets non-cloneable...

    Question : Pourquoi as-tu besoin de cloner tous les attributs de l'objet ???

    a++

  12. #12
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Bon les pros du java je vous est posé une colle on dirait pourtant je crois avoir trouvé la solution : l'introspection.

    En effet la classe Fields implément l'interface Cloneable :

    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
     
     
    public Object clone() throws CloneNotSupportedException {
            MonObjet objectCopie = (MonObjet)super.clone();
     
            //dupliquer le contenu des attributs
     
           Field[] attributsClone = (Field[])this.getClass().getDeclaredFields().clone();
           Field[] attributsObjectCopie =  objectCopie.getClass().getDeclaredFields();
     
           for (int i=0; i<attributsClone.length; i++) {
               attributsObjectCopie[i] = attributsClone[i];
           }
     
            return objectCopie;
        }
    Edit : bien joué AdiGuba tu avais trouvé avant moi
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  13. #13
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par danyboy85
    Le problème c'est que mon objet comporte des attributs de types différents : String ,int et des types Objet.

    Or , la classe String par exemple, n'implémente pas l'interface Cloneable, ce qui signifie que pour cloner une valeur de type String, je suis obligé de faire dériver la classe String en une classe String1 qui va implémenter la classe Cloneable et tous mes attributs de type String devront être de type String1 : extrémement lourd...
    Pour ce qui est de String, je pense pas que c'est un gros problème...

    Du fait de son immuabilité, tu t'en fous un peu de prendre la même référence et en plus, c'est pas très dur d'en faire un clone.

  14. #14
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par danyboy85
    Bon les pros du java je vous est posé une colle on dirait pourtant je crois avoir trouvé la solution : l'introspection.

    En effet la classe Fields implément l'interface Cloneable :
    Sauf que ton code est faux
    • La classe Field n'est pas Cloneable, et de toute manière elle représente une vue sur un attribut mais en aucun cas sa valeur.
    • Tu ne clone pas des Fields mais un tableau de Field. Or lorsqu'on clone un tableau on ne clone que le conteneur et non pas le contenu (les objets des deux tableaux sont identiques).
    Donc tu n'a pas cloner les attributs...


    Il faudrait que tu parcours le tableau de Field et que tu appelles la méthode get() pour récupérer la valeur de chaque attribut.
    Ensuite si ce dernier est Cloneable, il faut essayer d'appeller la méthode clone() via reflection (puisqu'elle est déclaré protected par défaut tu ne pourra pas l'appeller directement).
    Enfin si le cloneage à réussi il te faudra modifier la valeur de l'attribut avec la méthode set()...

    Tout cela en gérant un grand nombre d'exception...

    a++

  15. #15
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    En effet... tu as entièrement raison.

    Bon si quelqu'un a une méthode plus simple je suis preneur.

    Citation Envoyé par adiGuba
    Question : Pourquoi as-tu besoin de cloner tous les attributs de l'objet ???
    Car j'ai besoin de 2 objets distincts, qui n'ont aucune référence commune.

    En fait je crée un sorte d'éditeur HTML et lorsque l'utilisateur copie un bouton par exemple, le bouton copié doit avoir les mêmes propriétés que le bouton d'origine mais la modification d'une propiété de l'un ne doit en aucun cas modifier la valeur de la propriété de l'autre.
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  16. #16
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Hello,

    Deux problèmes se posent à mon avis:

    - est ce que en passant par l'introspection et sachant que tu vas récupérer un Object, est ce que le Object.clone() va te donner la méthode clone() de Oject ou de ta sous-classe (là je pense que la seconde proposition est vraie).

    - et si jamais ton attribut est un autre objet avec des autres attributs, que vas-tu-faire ?

    Donc pour avoir deux objects distincts c'est pas évident. Le deep clone c'est pas facile

    A+

  17. #17
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par wichtounet
    Pour ce qui est de String, je pense pas que c'est un gros problème...
    Du fait de son immuabilité, ...
    C'est quoi l'immuabilité ?

    Citation Envoyé par wichtounet
    ...tu t'en fous un peu de prendre la même référence...
    Ah bon et pourquoi ?

    Citation Envoyé par wichtounet
    ...et en plus, c'est pas très dur d'en faire un clone.
    Et comment ?
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  18. #18
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Pour les types primitifs, aucun souci de clonage.
    Pour ce qui est des objets, pourquoi ne pas utiliser les constructeurs par copie ? Si ce sont des bons constructeurs, ils ne copient pas la référence mais bien l'objet en lui même. Exemple de la classe String :
    Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string.
    Exactement ce que tu veux. Apres si ce sont tes propres objets, bah développes des constructeurs par copie qui invoquent en cascade des constructeurs par copie, etc etc

    Je ferais ça moi

    Bon courage

    Fred

    edit : immuabilité veut dire que tu ne peux changer l'objet. Si tu fais par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s="coucou";
    s=s+" c'est moi";
    c'est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s="coucou";
    s=new String("coucou c'est moi");
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  19. #19
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par mavina
    Salut,

    Pour les types primitifs, aucun souci de clonage.
    Pour ce qui est des objets, pourquoi ne pas utiliser les constructeurs par copie ? Si ce sont des bons constructeurs, ils ne copient pas la référence mais bien l'objet en lui même. Exemple de la classe String :

    Exactement ce que tu veux. Apres si ce sont tes propres objets, bah développes des constructeurs par copie qui invoquent en cascade des constructeurs par copie, etc etc

    Je ferais ça moi

    Bon courage

    Fred

    edit : immuabilité veut dire que tu ne peux changer l'objet. Si tu fais par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s="coucou";
    s=s+" c'est moi";
    c'est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s="coucou";
    s=new String("coucou c'est moi");
    - Oui c'est pas bête et ca POURRAIT résoudre mon problème cette idée de constructeur mais dans le cadre de mon appli c'est impossible à gérer (objets héritées, Factory...). En gros je ne connais pas toujours le type de l'objet que je dois cloner

    - J'ai trouvé une autre méthode : la sérialisation. Bon je vais me faire lyncher par certains mais en tout cas ca fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public Object copi() throws IOException, ClassNotFoundException {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            Object deepCopy = ois.readObject();
     
            return deepCopy;
        }
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  20. #20
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    Pour ton code sur la sérialisation, il manque des bloc try/finally afin de fermer correctement les flux.
    Jette un coup d'oeil sur le tutoriel : java.io


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [SimpleXML] Obtenir la valeur des attributs
    Par domishao dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 04/02/2008, 12h04
  2. Réponses: 1
    Dernier message: 22/01/2008, 17h24
  3. [XSLT] Eliminer les doublons de valeurs des attributs
    Par furybubu dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 04/05/2007, 10h09
  4. [XSD]fixer la valeur des attributs
    Par mamiberkof dans le forum Valider
    Réponses: 3
    Dernier message: 24/01/2007, 17h54
  5. changer la valeur des attribut
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/02/2006, 14h27

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