Problème entre objet d'une même classe

Résolu/Fermé
Kasuba Messages postés 11 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 22 décembre 2008 - 4 déc. 2008 à 20:29
Kasuba Messages postés 11 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 22 décembre 2008 - 22 déc. 2008 à 07:18
Bonjour,

j'ai un petit problème dans une fonction d'une classe.
dans cette fonction, un objet air1 de la classe Air est passé en paramètre. et dans cette même fonction , j'ai besoin d'instancier un autre objet de cette même classe Air. je le nomme air2. voici le code:

public double getEnergyConsumption(Air air1){
air2=new Air(t_low,hr_low);
System.out.println("temperature de l'air"+air1.getTemperature());
System.out.println("temperature de l'air"+air2.getTemperature());
consumption = air2.enthalpy() - air1.enthalpy();
return consumption;
}

lors de l'affichage de la température, si j'instancie air2 au début de la fonction, les 2 température (de air1 et air2) sont identiques et valent celle de air2. si par contre j'instancie air2 dans une autre fonction juste avant l'appel de la fonctiongetEnergyConsumption, les 2 température sont celle de air1. je ne comprend vraiment pas ce kil ce passe. il semble que même en nommant l'objet d'une autre manière, je remplace air1 par air 2 dans le premier cas. et dans le deuxième, je ne voit vraiment pas ce qu'il se passe.

j'avais aussi un autre problème expliqué sur ce forum il y a 1 mois et demi de ca qui je pense doit y être lié voici le code:

public static Vector read() {

try{

Reader r1 = new FileReader(file1);
BufferedReader br1 = new BufferedReader(r1);
while ( (line = br1.readLine()) != null ){

StringTokenizer st1 = new StringTokenizer(line, " ");
d=st1.nextToken();
h=st1.nextToken();
if ( d.compareTo(startDate)==0 ){
//System.out.println("lecture fichier1");
start=true;
}
if (d.compareTo(endDate)==0 && h.compareTo(endHour)==0){

stop=true;
}
if(stop){
//test si on est à la fin de la période de test
airFeatures.add(new Air(convertTemperature(st1.nextToken()), convertHr(st1.nextToken())));
System.out.println("stop lecture fichier1");
r1.close();
return airFeatures;
//break;
}
if ( (d.compareTo("12/12/"+startYear)==0) && (endHour.compareTo("23:00")==0) ){
System.out.println("changement de fichier");
Reader r2 = new FileReader(file2);
BufferedReader br2 = new BufferedReader(r2);
while ( (line = br2.readLine()) != null ){

//System.out.println("lecture fichier 2");
StringTokenizer st2 = new StringTokenizer(line, " ");
d=st2.nextToken();
h=st2.nextToken();
if (d.compareTo(endDate)==0 && h.compareTo(endHour)==0){
stop=true;
}
airFeatures.add(new Air(convertTemperature(st2.nextToken()), convertHr(st2.nextToken())));
if(stop){

r1.close();
r2.close();
System.out.println("stop lecture fichier2");
return airFeatures;
//break;
}
}
}
if(start){

airFeatures.add(new Air( convertTemperature(st1.nextToken()), convertHr(st1.nextToken())));


}
}

}
catch(IOException err){
System.out.println("chize");
}
return airFeatures;
}

quand je récupère airfeatures dans une autre classe, tout les attribut des objets Air contenu dans le vector sont identique à la dernière valeur lue dans le fichier txt. je n'en peux plus de ce problème et je suis sur que c'est une bêtise car j'ai déja fait cela dans un autre programme java

merci de votre aide.

7 réponses

pleaaaaaaaaaase
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
16 déc. 2008 à 11:12
Bonjour,
Le problème que j'identifie ici, c'est que utilises des attributs d'instances qui n'ont rien à faire en tant qu'attribut d'instance. Je m'explique :
air2=new Air(t_low,hr_low); : arrête moi si je me trompe, mais ici tu utilises des objets ou types primitifs qui ont été déclarés ailleurs que dans ta méthode (en l'occurrence ça doit être des attributs d'instance).

Pour ma part, je considère notamment que air2 n'a pas à être passé en attribut d'instance vu que tu te permets de le réinstancier dans cette méthode.

La première question que tu dois te poser, c'est "est-ce que air2 est bien une caractéristique de ma classe, autrement dit, est-ce que ça a un sens conceptuellement parlant de le déclarer comme attribut ?"
Si la réponse est non, tu peux essayer ça :
public double getEnergyConsumption(Air air1){
 Air air2=new Air(t_low,hr_low);
 System.out.println("temperature de l'air"+air1.getTemperature());
 System.out.println("temperature de l'air"+air2.getTemperature());
 consumption = air2.enthalpy() - air1.enthalpy();
 return consumption;
}


Ensuite, vérifie bien que air1 et air2 ne pointent pas sur les mêmes éléments (t_low et hr_low par exemple sont aussi des attributs d'instance). Un problème peut survenir si tu fais par exemple :
Integer t_low = new Integer(5);
Integer hr_low = new Integer(6);

Air air1 = new Air(t_low, hr_low);
//air1.getTLow().intValue() retourne 5

t_low = new Integer(8);
hr_low = new Integer(9);

Air air2 = new Air(t_low, hr_low);
/*ATTENTION : ici air1 pointe sur t_low et hr_low qui ont été modifié!*/
//air1.getTLow().intValue() retourne 8 !


Cordialement,
0
Kasuba Messages postés 11 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 22 décembre 2008
21 déc. 2008 à 14:22
merci beaucoup pour votre réponse. pour ce qui concerne air2, je l'ai maintenant instancié dans la classe mère car c'est une caractéristique de cette classe:

air2 = new Air(t_low,hr_high);
coolAir= new Air(t_high,hr_low);

j'écris cela dans le constucteur de la classe mère. suivant que je mes ces lignes dans un ordre ou dans un autre, les deux attribut température de air2 et coolAir pointe vers le dernier attribut créé. ici en l'occurence t_high. je touve ca bizare...

par ailleurs, auriez vous une idée pour la 2e partie de ma question? je pense que c'est du a la même raison, tout les objet point vers le dernier "st.nextToken" je ne vois donc pas trop comment m'en sortir... j'ai essayer de faire

String d = newString(st.nexToken());

rien n'y fait...

merci beaucoup !
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
21 déc. 2008 à 20:04
Bonjour,
Postes ici le code de ta classe Air stp.
Quand au problème avec ton string tokeniser, peux-tu reposter uniquement la méthode qui pose problème stp (en la mettant entre les balises "code" et en l'indentant que ce soit plus lisible) stp.
Merci.

Cordialement,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kasuba Messages postés 11 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 22 décembre 2008
21 déc. 2008 à 22:44
voici ma classe air :

" import java.awt.*;
import java.io.*;
import java.lang.Math;

public class Air{

private static double temperature=0;
private static double hr=0;
private static final double cpa=1.03073; //chaleur masique de l'air sec à 12 degré +- la variation de cp est très légère entre 0 et 25 degré on
private static double h; //entalpie par kg d'air sec // fait l'hypothèse qu'elle est constante sur cet interval chaleur massique = chaleur molaire /"mu"
private static double psat;
private static double x; //humidité absolue

public Air(double temperature, double hr){ //créer un nouvel objet air pour l'état de l'air après traitement

this.temperature = temperature;
this.hr = hr;
psat=Math.pow(10.0,2.7877 + ((7.625 *this.temperature) / (241.6 + this.temperature )) );
//System.out.println(date +" " + hour +" "+ temperature + " " + hr);
}

public static double x(){

return (0.622*hr*psat/(101.325-hr*psat));
}

public static double psat(double t){

return psat;
}

public static double enthalpy(){

return (cpa*temperature);
}


public static double getTemperature(){

return temperature;
}
public static double getHr(){

return hr;
}
} "

merci beacoup de ton aide
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
21 déc. 2008 à 22:49
Bonsoir,
Il faut supprimer le mot clé static devant tes attributs !
Static signifie que l'attribut est commun à toutes les instances de Air. Autrement dit, quand tu crées air1, il a les bonnes valeurs, et dès que tu crées air2, alors toutes tes instances de Air (et notamment air1) vont prendre les nouvelles valeurs.

Quand au problème avec ton string tokeniser, peux-tu reposter uniquement la méthode qui pose problème stp (en la mettant entre les balises "code" et en l'indentant que ce soit plus lisible) stp.
Merci.


Cordialement,
0
Kasuba Messages postés 11 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 22 décembre 2008
21 déc. 2008 à 22:55
et voici la fonction qui me pose problème elle se trouve dans une autre classe "ReadFile":

public static Vector read() {

try{

Reader r1 = new FileReader(file1);
BufferedReader br1 = new BufferedReader(r1);
while ( (line = br1.readLine()) != null ){

StringTokenizer st1 = new StringTokenizer(line, " ");
String d=new String(st1.nextToken());
String h=new String (st1.nextToken());
String t=new String (st1.nextToken());
String hr=new String (st1.nextToken());
if ( d.compareTo(startDate)==0 ){

start=true;
}
if (d.compareTo(endDate)==0 && h.compareTo(endHour)==0){

stop=true;
}
if(stop){

" airFeatures.add(new Air(convertTemperature(t), convertHr(hr))); "
System.out.println("stop lecture fichier1");
r1.close();
return airFeatures;
}
if(start){

" airFeatures.add(new Air( convertTemperature(t), convertHr(hr))); "

}
}

}
catch(IOException err){
System.out.println("problem");
}
return airFeatures;
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------

les partie entre guillemets sont celle qui posent problème. si j'affiche au fur et a mesure t d hr et h pas de soucis ils sont tous différents, mais quans je récupère airFeatures à l'extérieur de la fonction, tout les attributs des objets créers pointe vers ceux du dernier. si par contre je crée un vector avec uniquement les différent d ou hr ou h ou t, la il n'y a pas de problème avec le même code.

le fichier texte se présente sous la forme:

20/10/2006 23:00 6,7 67%
21/10/2006 00:00 6,8 68%

la fonction convertTemperature fait partie de la même classe et converti juste le String correspondant a la température en double.

encore merci de te pencher la dessus
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
21 déc. 2008 à 23:35
Regarde le post 6, en principe ça règle tous tes problèmes.

Cordialement,
0
Kasuba Messages postés 11 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 22 décembre 2008
22 déc. 2008 à 07:18
merci 1000 fois!
j'étais sur que c'était une bétise. je n'avais jamais bien compris cette notion de static. ca marche maintenant.
0