Votre question

Java: Probleme d'Ojbet passé en parametre de methode

Tags :
  • Java
  • Programmation
Dernière réponse : dans Programmation
31 Mai 2006 15:58:55

Bonjour!

Alors voilà, j'ai un probleme et je n'en comprend pas du tout la cause, donc je me dis que votre oeil d'expert pourra peut etre m'éclairé...

J'ai une methode dans une classe Reductor:

public Expression reduceAnExpression(/*final*/Expression expToReduce) {
Expression tmp = new Expression();
tmp.setName(expToReduce.getName());
for (int i = 0; i < expToReduce.getNbParameter(); i++) {
tmp.addElement(expToReduce.getAParam(i));
}
Expression tmp2 = new Expression();
tmp2 = reduce(tmp);
return tmp2;
}

Expression ex=new Expression();
Reductor reduc=new Reductor()
[....]
System.out.println(ex);
solution=reduc.reduceAnExpression(ex);
System.out.println(ex);
[/color]

Je ne comprend pas pourquoi mon objet "ex" (de type Expression) dans le Main est modifié (les 2 println n'affiche pas la meme chose!)

J'ai le nez la dessus depuis des heures et je ne comprend pas pourquoi! Si jamais vous pouvez me l'expliqué, se serait vraiment sympa! Merci d'avance!

(A noté que tout le reste marche tres bien)

Autres pages sur : java probleme ojbet passe parametre methode

a b L Programmation
31 Mai 2006 19:16:44

je pense que les problèmes viennet de ces endroits:
  1. tmp.setName(expToReduce.getName());
  2. tmp.addElement(expToReduce.getAParam(i));

Fais-tu une copie dans setName et addElement ?
si non, tu envoie une référence à l'objet: les 2 objets Expression sont bien différents mais leur contenu pointe sur les mêmes données.
Je ne vois que ça.

Essaie:
  1. tmp.setName(new Obj(expToReduce.getName()));
  2. tmp.addElement(new Obj(expToReduce.getAParam(i)));

Où obj est le type d'objet retourné par le get, donc à remplacer par le bon (String ?).
1 Juin 2006 10:50:46

Merci pour ta réponse!

Malheureusement j'ai modifié comme tu l'a indiqué, et l'objet passé en paramètre est quand meme modifié...

Peut etre une autre idée?
Contenus similaires
Pas de réponse à votre question ? Demandez !
a b L Programmation
1 Juin 2006 12:59:02

ça retourne quel type d'objet ?
parce que si les constructeur par recopie de ces objets sont mal faits, des références sont gardées.

1 Juin 2006 18:54:51

çà retourne le type "Expression"...

Pour le constructeur par recopie je ne sais pas trop comment faire, peut etre peut tu m'aidé?

Voilà comment j'ai fait le constructeur de la classe Expression:

public Expression(Expression exp) {
name=exp.name;
args=exp.args;
}
[/color]

où name est de type String, et args de type ArrayList (données membres public de la classe)

Est ce que tu pense que le probleme vient de là?
a b L Programmation
1 Juin 2006 19:35:51

Oui le problème vient de là car ici:
  1. name=exp.name;

Tu ne fait qu'affecter une référence: si tu modifies name, tu modifies exp.name. Et inversement, si tu modifies exp.name, tu modifie name.
Donc, plus haut, quand tu modifie le name du nouvel objet, tu modifie le name de l'ancien.

Dans un constructeur par recopie il faut toujours créer de nouveau objets.

Donc pareil, ici, tu dois mettre
  1. name = new Objet(exp.name)

Et là aussi, il faut vérifier que le constructeur par recopie de Objet fait bien une copie, et ainsi de suite jusqu'à tomber sur les constructeurs par recopie des objets Java (qui font une recopie correcte).

D'ailleurs je te suggère de revoir toutes tes classes et de mettre un constructeur par recopie si elles n'en n'ont pas, de vérifier que tous les objets sont copiés et de vérifier que tous les objets sont créés par des new.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS