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

Java Discussion :

Affecter une valeur d'attribut d'un objet à un autre


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut Affecter une valeur d'attribut d'un objet à un autre
    Bonjour à tous,
    J’aimerais avoir votre avis sur le problème suivant :
    soient deux objets de la même classe A :
    toto=new A() ;
    tata=new A() ;
    La classe A a un attribut c de type B (une autre classe B).
    On désire attribuer à l’objet tata la même valeur d’attribut c de l’objet toto. je suis tenté d’écrire :
    tata.c=toto.c ;
    Seulement voila que java ne fonctionne qu’avec des références ; ce qui incite à déduire que tata.c est une référence qui est la même que toto.c. Il s’agit ainsi du même objet c.
    Si je modifie toto.c, tata.c se trouvera affecté.
    C’est embêtant !!
    Comment attribuer à tata la même valeur c de l’objet toto sans qu’il s’agisse du même objet.
    Une copie peut être ?
    Merci à vous

  2. #2
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    Et oui, j'ai utilisé la méthode clone() (Merci aux cours de développez.com).
    Cela marche.
    Par contre, et comme je travaille en ce moment sur les arbres dont les hauteurs peuvent aller haut, je dois appeler clone() pour tous les nœuds, je ne vous dis pas la galère. Franchement, Java n'a pas fait fort à ce niveau!!
    Je vais peut être tout basculer en un autre langage!
    Cordialement

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    J'avoue ne pas comprendre le problème...
    En toute logique votre noeud doit implémenté l'interface Cloneable.
    En clonant un élément de votre arbre, vous clonez aussi ses enfants et les enfants de ses enfants (par récursion). Sinon ce n'est pas un vrai clone.
    Imaginez un peu deux personnes qui ont le même bras et deux bras qui ont la même mains...
    Si la méthode clone est bien implémenté, alors lorsqu'on clone une personne, on va cloner son bras. Et lorsqu'on clone un bras, on clone sa main.
    Le tout réside dans l'implémentation de votre fonction clone.

    Vous pouvez certes changer de langage, mais cela ne changera pas votre problème.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Membre éclairé
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Par défaut
    Merci pour ta réponse que j'ai bien saisie.

    Utiliser la récursivité pour clone()est une super idée! Mais encore faut il la réussir sans pour autant parcourir tout l'arbre à cloner. J'aimerais tout de même éviter de cloner à chaque fois que je crée un objet de la classe arbre, mais plutôt quand j'en ai besoin; c'est là la difficulté!


    j'ai défini ma classe arbre de la manière suivante :

    public class arbre {

    Integer racine;
    arbre suivant_gauche, suivant_droit;

    ......
    }

    Admettons que je crée un arbre arb :
    arbre arb=new arbre();

    si je clonne arb :

    arb1=(arbre) arb.clone();

    (arb1 étant déjà déclarée)

    arb.suivant_gauche n'est pas cloné et il est le même que arb1.suivant_gauche par exemple.

    Il n'a y a que la référence sur arb qui a été affecté et non celles de suivant_gauche et suivant_droit en tant qu'arbres.

    Mais tout cela, tu le sais déjà.

    Il faut maintenant que je travaille sur le constructeur, au pire, pour utiliser la récursivité sur clone() . Je ne vois pas comment si arb est déjà construite.

    Bien à toi

  5. #5
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Les problemes dont tu parles n'est pas spécifique à Java. Si tu codais ton arbre en c, tu utiliserais des pointeurs pour suivant_gauche et suivant_droit. Donc, en cas de recopie, tu pointerais sur les memes objets (tiens, ca me rappelle quelque chose...). Bref, tu aurais la meme problematique.

    Maintenant, pour revenir à ton arbre, en général, ceux-ci sont surtout utiliser pour classer des données et n'ont pas vocation à etre clonés (à la limite, l'arbre entier, peut etre mais juste certains elements...). A mon avis, tu devrais nous dire pourquoi tu cherches à cloner certains elements car le probleme vient peut etre d'une mauvaise architecture...

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il suffit de redéfinir clone()... Les tutoriels parlent de ça aussi -_-°.

    Accessoirement, si on a peur du grand méchant clone(), houlàlà c'est un mécanisme du langage je veux pas toucher ça ça a l'air trop compliqué, ou bien dans des cas plus avancés quand clone() est effectivement contraignant, il suffit de mettre à disposition ses propres méthodes de copie profonde. Je ne vois pas ce qu'il y a de compliqué là-dedans. (À moins qu'il puisse aussi y avoir des cycles. Auquel cas, c'est en effet plus difficile. Comme dans n'importe quel langage d'ailleurs.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par wafiwafi Voir le message
    je suis tenté d’écrire :
    tata.c=toto.c ;
    Seulement voila que java ne fonctionne qu’avec des références ; ce qui incite à déduire que tata.c est une référence qui est la même que toto.c. Il s’agit ainsi du même objet c.
    Si je modifie toto.c, tata.c se trouvera affecté.
    oui est non

    si tu fais toto.c.setMachin("nouveau machin") alors oui le changement se fait des deux coté, logique, mais si tu fais
    toto.c=new C();
    alors maintenant toto.c et tata.c sont différent, puisqu'il s'agit de deux références séparées.


    Par "facilité" je suppose que tu parle du fait qu'en C++ on puisse faire

    C c1 = .....
    C c2 = c1
    et alors c2 est un autre objet avec une copie. Mais le travail que tu dois faire dans clone en java, en C++ tu le fera dans le constructeur par copie, ce qui reviens strictement au même

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/01/2014, 22h05
  2. Affecter une valeur à un tableau d'objets
    Par Christophe Genolini dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 05/08/2013, 13h39
  3. affectation d'une valeur à l'attribut d'une liste
    Par cybermat3 dans le forum JSF
    Réponses: 1
    Dernier message: 16/03/2009, 08h54
  4. Réponses: 1
    Dernier message: 03/05/2007, 08h10
  5. impossible d'affecter une valeur à un objet
    Par Dafbau dans le forum Access
    Réponses: 2
    Dernier message: 22/09/2006, 10h48

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