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

avec Java Discussion :

cloner un object


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Points : 26
    Points
    26
    Par défaut cloner un object
    Je voudrais cloner un objet dont je ne connait pas le type (pas un lien mais réelement le dupliquer en mémoire).

    Par exemple, j'ai l'object Y de type X et j'aimerai créer un nouvelle object Z de type X.

    Object Z = ???

    J'ai regardé dans la doc j'ai trouvé la méthode clone() pour object mais c'est protected !!! Ou faut il passer par getClass() ?

    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 895
    Points : 1 710
    Points
    1 710
    Par défaut
    Il faudrait que ta classe X implémente la classe Cloneable, c'est dans la FAQ Java.
    ++

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Z = x.clone();

    Au fait, il n'est pas obligatoire que X implémente Cloneable (contrairement à ce que la FAQ dit). C'est seulement obligatoire si X ne surcharge pas la méthode clone() pour faire le clonage lui même ou si il le fait mais en faisant appel à super.clone() qui remonte jusque Object. L'interface cloneable est seulement là pour dire à Object.clone() qui peut se contenter de faire une réattribution sur chaque propriété pour créer le clone.

    Edit: il est un peu tard et j'oublie la moitié. Bien entendu, x doit être déclaré comme étant d'un type rendant clone() public. Impossible donc si x est déclaré comme "Object". Si tu veux pas passer par des types connus comme ayant un public clone(), alors tu va devoir y aller par réflection :p

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Points : 26
    Points
    26
    Par défaut
    En fait c'est pas des classes que j'ai programmé moi même donc je ne controle pas si elle implémente cloneable.

    En tout cas, quand j'essaie clone() il me dit que c'est pas possible...

    J'ai lu ca sur la réflection : http://ricky81.developpez.com/tutori...reflection/#L3

    mais je comprend pas en quoi ca peut m'aider (je débute).

  5. #5
    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 tchize_ Voir le message
    Au fait, il n'est pas obligatoire que X implémente Cloneable (contrairement à ce que la FAQ dit). C'est seulement obligatoire si X ne surcharge pas la méthode clone() pour faire le clonage lui même ou si il le fait mais en faisant appel à super.clone() qui remonte jusque Object. L'interface cloneable est seulement là pour dire à Object.clone() qui peut se contenter de faire une réattribution sur chaque propriété pour créer le clone.
    Le fait d'implémenter Cloneable permet justement d'appeler la méthode clone() de Objet qui réalise un vrai clone.
    Et si tu te contente de redéfinir la méthode clone() sans faire appel à super.clone() ce n'est plus vraiment du cloneage et tu ne respectes pas les convention de la méthode clone()...


    Citation Envoyé par dword2add Voir le message
    En fait c'est pas des classes que j'ai programmé moi même donc je ne controle pas si elle implémente cloneable.
    Si les objets ne sont pas cloneable tu ne pourrais pas les cloner

    Pourquoi voudrais-tu cloner cet objet ?

    a++

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Et si tu te contente de redéfinir la méthode clone() sans faire appel à super.clone() ce n'est plus vraiment du cloneage et tu ne respectes pas les convention de la méthode clone()...
    La convention n'oblige pas à appeler super. Tu peut implémenter clone comme tu l'entends. La pluspart des commentaire dans l'api font mention de comportement souhaités, mais pas de comportement obligatoires. L'api mention aussi que si on remonte juste Object.clone() alors, on a la garantie que la classe est la même. C'est tout.

  7. #7
    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 tchize_ Voir le message
    La convention n'oblige pas à appeler super.
    Pourtant dans l'API de clone() il y a marqué ceci :
    By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass().
    Citation Envoyé par tchize_ Voir le message
    Tu peut implémenter clone comme tu l'entends. La pluspart des commentaire dans l'api font mention de comportement souhaités, mais pas de comportement obligatoires. L'api mention aussi que si on remonte juste Object.clone() alors, on a la garantie que la classe est la même. C'est tout.
    Mais du coup si on n'utilises pas Object.clone() ce n'est pas vraiment un clone mais une copie. C'est différent !


    a++

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    *should* pas *must*, ce n'est donc pas obligatoire, juste désirable (bon pour la pluspart des cas quoi). D'ailleurs, il est bien aussi marqué dans l'api, au sujet du comportement face à == et equals, que ceux-ci ne sont pas obligatoires

    Mais du coup si on n'utilises pas Object.clone() ce n'est pas vraiment un clone mais une copie. C'est différent !
    heu, l'api dis explicitement:
    Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object.
    Donc, à mon avis, copie et clone, sont des concepts identiques D'ailleurs, à partir du moment où ma méthode clone() renvoie une copie de this, peut importe comment elle a géré sa popotte interne, je pense que le contrat de la méthode clone() est respecté.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 255
    Points : 99
    Points
    99
    Par défaut
    Je conseille le très bon :

    http://bruce-eckel.developpez.com/li...chap=17&page=0

    qui explique tout ça très bien.

Discussions similaires

  1. [C#] Déréférencer/cloner object
    Par Babas007 dans le forum C#
    Réponses: 30
    Dernier message: 21/11/2010, 23h59
  2. [DDL] "object <table> is in use"
    Par TMuet dans le forum SQL
    Réponses: 4
    Dernier message: 26/01/2004, 10h18
  3. Réponses: 8
    Dernier message: 21/11/2003, 18h38
  4. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21
  5. Comment cloner un composant
    Par totoranky dans le forum Composants
    Réponses: 2
    Dernier message: 12/04/2003, 15h29

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