bonjour, je n'ai pas trouvé dans mon bouquin de java comment faire pour que 2 classes pointent vers la meme variable.
Merci, et je continue de chercher
bonjour, je n'ai pas trouvé dans mon bouquin de java comment faire pour que 2 classes pointent vers la meme variable.
Merci, et je continue de chercher
place la variable en static dans une des classes tu pourras y acceder de n' importe ou avec un NomClasse.NomVarible
je vois deux solutions, mettre une variable en "public static" ce qui permet a toutes les classes d'y acceder ou donner au contructeur d'une de tes classes la variable de l'autre qui est partagé ! Attention ! le fait de passer par le constructeur a une sementique un peu differente : ce n'est pas ta classe qui peut acceder a la variable mais les instances de cette classe !
j'espere avoir été assez clair et que cela puisse t'aider
Et puis quand deux classes qui pointent vers la même variable il peut y avoir des problèmes de synchronisation...DANGER.
Imagine deux personnes qui possèdent le même compte en banque (mari et femme par exemple). Un retrait simultanné des deux personnes peut engendrer des erreurs si le cas n'a pas été prévu.![]()
On s'en fou c'est la banque qui est en tord et elle a qu'a rembourserEnvoyé par c-top
![]()
en ce qui concerne le public static, est ce que je peux ensuite modifier à volonte cette variable au cours du programme ?
merci
pour la partie constructeur j'avais pense a qqch comme ca, si tu pouvais developper, ca m'aiderait (je ne vois pas trop ce que tu veux dire par les "instances de cette classe")
Merci encore
ouiEnvoyé par Adaemon
les instances d'une classes sont les objects : par exemple :Envoyé par Adaemon
dans cet exemple tc est une instance de la classe TaClasse
Code : Sélectionner tout - Visualiser dans une fenêtre à part TaClasse tc = new TaClasse(...);
Ce que tu peux faire, c'est de passer ta variable partagé par les constructeurs :
dans ce cas ton attribut peut etre different pour chaque object de ta classe. ce qui est completement different d'une public static !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public class TaClasse { private Object varPartagee = null; public TaClasse(Object varPartagee) { this.varPartagee = varPartagee; } }
pour s'approcher un peu d'une variable partagée public static tu peux aussi ecrire :
A ce moment, tu auras une variable de classe qui pourra etre partagé avec la classe qui a construit ton object. (enfin a peu de chose pres si tu ecris l'autre classe correctement)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public class TaClasse { private static Object varPartagee = null; public TaClasse(Object varPartagee) { if(TaClasse.varPartagee==null) { TaClasse.varPartagee = varPartagee; } } }
L'avantage de passer par les constructeur, c'est que ta variable partagé ne sera pas visible de toutes les classes puisqu'elle sera privé !
Je viens aussi de penser a une autre methode qui serait d'utiliser le mechanisme d'introspection pour acceder a un attribut privé d'une autre classe (cf ce topic qui pourra te donner des indication sur l'introspection : http://www.developpez.net/forums/vie...853842#1853842)
si tu veux encore plus de renseignement je suis toujours dans le coin
en esperant t'avoir aidé
J'aime beaucoup le :sinon en fait j'utilisais deja cette technique de constructeurs. Par contre pour les static j'ai des problemes : je fais :le mechanisme d'introspection pour acceder a un attribut privé d'une autre classe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class InitVariables { static String path; } class MaClasse { MaClasse(){ System.out.println(path); } }
[EDIT] bon, le temps que je poste ma reponse, il y a deja eu une autre reponse. Vu le temps et la reflexion que j'ai mis dans le message, je ne l'efface pas[/EDIT]
Pour repondre a ton interrogation sur "les instances de cette classe"
Imaginons que tu ais une classe A que tu as defini. Les instances de la classe A sont en fait tous les object qui sont de la classe A.
Dans mon exemple, objet1 et objet2 sont deux instances de ta classe A
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 A objet1 = new A() ; A objet2 = new A() ;
Quand Mobius dit que lorsque tu passes par le constructeur, ceux sont les instances qui ont acces aux champs, cela signifie que si tu passes un objet au constructeur, celui ci peut etre differents pour toutes les instances de la classe. Si tu veux que toutes les instances de ta classe ai acces au meme objet, il faut que tu passes par static. Imaginons que tu veuilles compter le nombre d'instance d'une classe, tu peux fire comme suit :
Dans ce cas la, toutes les instances de ta classe A partagerons un meme attribut _cpt. Si tu veux passer par le contructeur, il faut faire par exemple comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public class A{ public static int _cpt = 0; public A(){ _cpt++ ; } }
Dans ce cas la, par exemple toutes tes instances partagerons le meme champs ... Par contre, il faut que tu fasses attention, car comme java utilise des pointeurs cache, ca peut ammener des surprises. Prenons le cas suivant : tu as deux classes A et B qui veulent partager un unique objet pour chacune des instances, donc tu vas les declarer comme static et tu vas passer le constructeurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public class A{ public static B _cpt ; public A(B c){ _cpt = c ; } }
Maintenant que tu as tes deux classes, voici comment tu peux te debrouiller pour les faire partager un objet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class A{ public static C _objPartage ; public A( C obj ){ _objPartage = obj ; } } class B{ public static C _objPartage ; public B( C obj ){ _objPartage = obj ; } }
Maintenant tous les instances de A et B partages l'objet C... mais attention, si tu contruis une nouvelle instance de A avec le meme contructeur, tu vas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 C objPartage = new C() ; A a = new A(objPartage) ; B b = new B(objPartage) ;
"departager" l'objet objPartage entre A et B... donc il faut faire attention.
Comme tu touches a des attributs static, tu peux aussi faire en sorte de passer par des methodes static pour allouer l'objet C - et perso, je trouve que c'est mieux. Ainsi, pour etre sur de ne pas modifier l'attribut de la classe A sans modifier celui de B, tu peux te debrouiller pour appeler la methode static de B dans celle de A ainsi, si tu modifie l'attribut partage de la classe A, tu le partages directement avec la classe B.
Apres avoir ecris ce long roman, je viens de me rendre compte que l'on pouvait faire autrement, je n'efface pas tout comme ca tu pourras choisir ta facon de faire.
L'idee est d'utiliser l'heritage :
Voila, cette methode semble regler tous les problemes, mais a le desavantage de devoir forcer les deux classes a etre "soeur", i.e. a deriver de la meme classe abstraite... J'ai mis la classe abstraite, c'est juste parce que c'est une classe qui n'a pas le besoin de pouvoir etre instancier directement, car elle est creer uniquement pour faire un lien entre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class abstract Mere{ protected static O _objPartage ; public static void setPartage(O objAPartager ){ _objPartage = objAPartager ; } } class A extends Mere{} class B extends Mere{} }
comme ca c'est mieu !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class InitVariables { public static String path; } class MaClasse { MaClasse(){ System.out.println(InitVariables.path); } }
merci moebius ^^ je viens de le remarquer alors je me suis vite connecte pour ptet espere enlever le message avant que qqn le voit (ralala boulet un jour, boulet pour toujours ^^)
euh benratti, laisse moi un peu le temps de lire ton message
eh beh que d'idees benratti, pense avoir compris maintenant les instances et comment faire des variables partagees.
Bon merci à tous alors
@+ tard je retourne coder
Partager