|
Réalisation 
|
|
Portée des variables
|
Grrr... Je désespère de trouver une réponse à un problème tout simple, dû
au fait que je débute en Java... Je suis sûr que vous allez trouver ça
simplissime: J'ai une classe principale qui contient des variables qui
seront utilisées par toutes les classes filles appellées (ces classes
correspondent à des formulaires, des boîtes de dialogues, etc.). Ces
variables sont appellées à changer (par exemple: la classe mère contient
une variable indiquant le nombre de fenêtres ouvertes, et chaque classe
fille doit y accéder pour pouvoir l'incrémenter ou la décrémenter). Le
problème est que le compilateur me sort toujours des choses comme "il faut
que votre variable soit déclarée comme statique pour être appellée".
Pénible ! Je ne veux pas de variable statique...
Vous avez ci-dessous un extrait de mon code: je veux "partager" la
variable conn entre toutes les classes filles appellées à partir de la
classe mère MainFrame (qui est elle même appellée par la class principale
du programme). J'ai lu quelque part que l'on ne pouvait pas le faire
directement, donc j'ai créé dans la classe appelante (MainFrame) une
fonction "getConnection" qui renvoie la valeur de conn (et
"doMySQLconnection" qui la définie). A ce stade, pfff... J'ai tout essayé.
Si je ne déclare pas les fonctions comme statiques, dans les classes
filles j'ai un message "A reference to an instance of class MainFrame is
required to access this non static member of it" lorsque j'essaye de les
appeller (par le biais d'un "autre_conn = MainFrame.getConnection()")...
Si je les déclare comme statiques, comme ci-dessous, j'ai le même problème
avec la variable conn... Snif ! Je veux bien indiquer une instance active
de MainFrame, mais comment on fait ça ?
Aurélien Mazurie
public class MainFrame extends JFrame
{
// Acces a la base MySQL
private Connection conn;
public static void doMySQLconnection (String host, String user, String
password)
{
try { Class.forName("org.gjt.mm.mysql.Driver"); }
catch (java.lang.ClassNotFoundException e)
{
System.err.println(" Erreur ClassNotFoundException: ");
System.err.println(" " + e.getMessage());
}
try { conn =
DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
catch (SQLException ex)
{
System.err.println(" Erreur SQLException:");
System.err.println(" " + ex.getLocalizedMessage() + "\n
(erreur " + ex.getErrorCode() + ")");
}
}
public static Connection getConnection ()
{
return conn;
}
...
 |
 |
A propos du "static" le problème n'est pas d'en vouloir ou pas mais d'en
avoir besoin ou pas, nuance! :-)
Si tu veux qu'un attribut soit partagé par toutes les instances d'une
classe A tu n'as pas le choix, il doit être "static".
Dans ton cas (classe fille appelant méthodes de la classe mère) tu n'en
n'a pas besoin. Il suffit de déclarer getConnection() "public" (pour faire
simple), et de passer à ta classe fille, dans son constructeur par
exemple, une référence sur la classe mère. Après dans la classe fille un
simple mère.getConnection() suffit.
-- Use Opera, the most user-friendly web browser on Earth --
 |
 |
Je ne cherche pas à avoir mes fonctions getConnection() et
doMySQLconnection() comme statiques; j'ai juste tenté pour voir si le
compilateur l'acceptait. Je l'ai d'ailleurs retiré. Mais le pb. c'est que
maintenant je ne sais pas comment appeler ces fonctions à partir des
classes filles.
Par exemple, dans la classe fille, voilà le problème:
public class ExpClass extends JFrame
{
public ExpClass ()
{
Connection new_conn = [quoi mettre ici ?].getConnection();
...
La classe mère qui appelle ExpClass s'appelle MainFrame, et j'ai essayé
MainFrame.this, mainFrame.this ... pour appeller getConnection dans
ExpClass. Rien ne marche. (note: mainFrame correspond à l'objet créé lors
de l'appel de MainFrame par la classe principale du programme (via
MainFrame mainFrame = new MainFram() ))
Aurélien
Le mardi 28 mai 2002, à 04:01 , Sebastien Cesbron a écrit :
> Le problème c'est que tu utilises conn qui n'est pas static dans des
> méthodes static. Tu as deux solutions pour résoudre ton problème
>
> - tu ne mets pas ta méthode doMySQLconnection static
> - tu veux absolument la mettre static. Dans ce cas tu utilises une
> variable locale à la méthode et tu retournes une Connection et tu
> l'utiliseras dans ton code en faisant conn = doMySQLconnection(...)
>
> Seb
>
> Aurélien Mazurie wrote:
>> Grrr... Je désespère de trouver une réponse à un problème tout simple,
>> dû au fait que je débute en Java... Je suis sûr que vous allez trouver
>> ça simplissime: J'ai une classe principale qui contient des variables
>> qui seront utilisées par toutes les classes filles appellées (ces
>> classes correspondent à des formulaires, des boîtes de dialogues,
>> etc.). Ces variables sont appellées à changer (par exemple: la classe
>> mère contient une variable indiquant le nombre de fenêtres ouvertes, et
>> chaque classe fille doit y accéder pour pouvoir l'incrémenter ou la
>> décrémenter). Le problème est que le compilateur me sort toujours des
>> choses comme "il faut que votre variable soit déclarée comme statique
>> pour être appellée". Pénible ! Je ne veux pas de variable statique...
>> Vous avez ci-dessous un extrait de mon code: je veux "partager" la
>> variable conn entre toutes les classes filles appellées à partir de la
>> classe mère MainFrame (qui est elle même appellée par la class
>> principale du programme). J'ai lu quelque part que l'on ne pouvait pas
>> le faire directement, donc j'ai créé dans la classe appelante
>> (MainFrame) une fonction "getConnection" qui renvoie la valeur de conn
>> (et "doMySQLconnection" qui la définie). A ce stade, pfff... J'ai tout
>> essayé. Si je ne déclare pas les fonctions comme statiques, dans les
>> classes filles j'ai un message "A reference to an instance of class
>> MainFrame is required to access this non static member of it" lorsque
>> j'essaye de les appeller (par le biais d'un "autre_conn =
>> MainFrame.getConnection()")... Si je les déclare comme statiques, comme
>> ci-dessous, j'ai le même problème avec la variable conn... Snif ! Je
>> veux bien indiquer une instance active de MainFrame, mais comment on
>> fait ça ?
>> Aurélien Mazurie
>> public class MainFrame extends JFrame
>> {
>> // Acces a la base MySQL
>> private Connection conn;
>> public static void doMySQLconnection (String host, String user,
>> String password)
>> {
>> try { Class.forName("org.gjt.mm.mysql.Driver"); }
>> catch (java.lang.ClassNotFoundException e)
>> {
>> System.err.println(" Erreur ClassNotFoundException: ");
>> System.err.println(" " + e.getMessage());
>> }
>> try { conn =
>> DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
>> catch (SQLException ex)
>> {
>> System.err.println(" Erreur SQLException:");
>> System.err.println(" " + ex.getLocalizedMessage() + "\n
>> (erreur " + ex.getErrorCode() + ")");
>> }
>> }
>> public static Connection getConnection ()
>> {
>> return conn;
>> }
>> ...
>
>
> ________________________________________________________________________
> ______ ifrance.com, l'email gratuit le plus complet de l'Internet ! vos
> emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
> http://www.ifrance.com/_reloc/email.emailif
>
>
>
 |
 |
En fait l'utilisateur doit pouvoir se déconnecter de la base en cours pour
se reconnecter à une autre (par contre il n'est pas possible d'avoir deux
connections simultanées). Donc la variable "conn" ne doit pas être figée.
Aurélien
Le mardi 28 mai 2002, à 02:31 , Philippe Delrieu a écrit :
> D'une manière générale lorsque l'on veut partager une ressource ou une
> variable entre plusieurs instances de classes et être sûre que la
> ressource ne sera initialisée qu'une fois (c'est souvent le cas avec les
> connexion aux bases de données) il faut utiliser le pattern singleton.
> Ce pattern garanti la création unique d'une classe et son partage parmis
> les autres. Le modèle dans ton cas peut être le suivant :
>
> public ConnectionManager {
> private staitc ConnectionManager manager;
> private Connection conn;
>
> private ConnectionManager () {
> try { Class.forName("org.gjt.mm.mysql.Driver"); }
> catch (java.lang.ClassNotFoundException e)
> { System.err.println(" Erreur
> ClassNotFoundException: ");
> System.err.println(" " + e.getMessage());
> }
>
> try { conn =
> DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
> catch (SQLException ex)
> {
> System.err.println(" Erreur SQLException:");
> System.err.println(" " + ex.getLocalizedMessage() + "\n
> (erreur " + ex.getErrorCode() + ")");
> } }
>
> public static ConnectionManager getManager() {
> if (manager == null) { synchronized
> (ConnectionManager ) {
> if (manager == null) {
> manager = new ConnectionManager (); }
> }
> }
> }
>
> public Connection getConnection() {
> return conn;
> }
> }
>
> Pour le user / password tu peux utiliser des properties ou
> pré-initialiser la classe avec les bonnes valeurs.
>
> Pour avoir ta connexion tu utilises la ligne suiivante :
> Connection conn = ConnectionManager.getManager().getConnection();
>
> La connexion n'est créée qu'une seule fois et partager par toutes les
> classes. Autres remarques : pour les acces aux bases de données il vaut
> mieux utiliser un gestionnaire de connexion qui créée et libère les
> connexions d'une manière plus transparente.
>
> Philippe Delrieu
> Cybernomade
>
> Sebastien Cesbron wrote:
>
>> Le problème c'est que tu utilises conn qui n'est pas static dans des
>> méthodes static. Tu as deux solutions pour résoudre ton problème
>>
>> - tu ne mets pas ta méthode doMySQLconnection static
>> - tu veux absolument la mettre static. Dans ce cas tu utilises une
>> variable locale à la méthode et tu retournes une Connection et tu
>> l'utiliseras dans ton code en faisant conn = doMySQLconnection(...)
>>
>> Seb
>>
>> Aurélien Mazurie wrote:
>>
>>>
>>> Grrr... Je désespère de trouver une réponse à un problème tout
>>> simple, dû au fait que je débute en Java... Je suis sûr que vous allez
>>> trouver ça simplissime: J'ai une classe principale qui contient des
>>> variables qui seront utilisées par toutes les classes filles appellées
>>> (ces classes correspondent à des formulaires, des boîtes de dialogues,
>>> etc.). Ces variables sont appellées à changer (par exemple: la classe
>>> mère contient une variable indiquant le nombre de fenêtres ouvertes,
>>> et chaque classe fille doit y accéder pour pouvoir l'incrémenter ou la
>>> décrémenter). Le problème est que le compilateur me sort toujours des
>>> choses comme "il faut que votre variable soit déclarée comme statique
>>> pour être appellée". Pénible ! Je ne veux pas de variable statique...
>>>
>>> Vous avez ci-dessous un extrait de mon code: je veux "partager" la
>>> variable conn entre toutes les classes filles appellées à partir de la
>>> classe mère MainFrame (qui est elle même appellée par la class
>>> principale du programme). J'ai lu quelque part que l'on ne pouvait pas
>>> le faire directement, donc j'ai créé dans la classe appelante
>>> (MainFrame) une fonction "getConnection" qui renvoie la valeur de conn
>>> (et "doMySQLconnection" qui la définie). A ce stade, pfff... J'ai tout
>>> essayé. Si je ne déclare pas les fonctions comme statiques, dans les
>>> classes filles j'ai un message "A reference to an instance of class
>>> MainFrame is required to access this non static member of it" lorsque
>>> j'essaye de les appeller (par le biais d'un "autre_conn =
>>> MainFrame.getConnection()")... Si je les déclare comme statiques,
>>> comme ci-dessous, j'ai le même problème avec la variable conn... Snif
>>> ! Je veux bien indiquer une instance active de MainFrame, mais comment
>>> on fait ça ?
>>>
>>> Aurélien Mazurie
>>>
>>> public class MainFrame extends JFrame
>>> {
>>> // Acces a la base MySQL
>>> private Connection conn;
>>>
>>> public static void doMySQLconnection (String host, String user,
>>> String password)
>>> {
>>> try { Class.forName("org.gjt.mm.mysql.Driver"); }
>>> catch (java.lang.ClassNotFoundException e)
>>> {
>>> System.err.println(" Erreur ClassNotFoundException: ");
>>> System.err.println(" " + e.getMessage());
>>> }
>>>
>>> try { conn =
>>> DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
>>> catch (SQLException ex)
>>> {
>>> System.err.println(" Erreur SQLException:");
>>> System.err.println(" " + ex.getLocalizedMessage() + "\n
>>> (erreur " + ex.getErrorCode() + ")");
>>> }
>>> }
>>>
>>> public static Connection getConnection ()
>>> {
>>> return conn;
>>> }
>>>
>>> ...
>>>
>>>
>>
>>
>>
>> _______________________________________________________________________
>> _______ ifrance.com, l'email gratuit le plus complet de l'Internet !
>> vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
>> http://www.ifrance.com/_reloc/email.emailif
>>
>
>
>
>
 |
 |
D'une manière générale lorsque l'on veut partager une ressource ou une
variable entre plusieurs instances de classes et être sûre que la
ressource ne sera initialisée qu'une fois (c'est souvent le cas avec les
connexion aux bases de données) il faut utiliser le pattern singleton. Ce
pattern garanti la création unique d'une classe et son partage parmis les
autres. Le modèle dans ton cas peut être le suivant :
public ConnectionManager {
private staitc ConnectionManager manager;
private Connection conn;
private ConnectionManager () {
try { Class.forName("org.gjt.mm.mysql.Driver"); }
catch (java.lang.ClassNotFoundException e)
{
System.err.println(" Erreur ClassNotFoundException: ");
System.err.println(" " + e.getMessage());
}
try { conn = DriverManager.getConnection("jdbc:mysql:///mabase", "",
""); }
catch (SQLException ex)
{
System.err.println(" Erreur SQLException:");
System.err.println(" " + ex.getLocalizedMessage() + "\n (erreur " +
ex.getErrorCode() + ")");
} }
public static ConnectionManager getManager() {
if (manager == null) {
synchronized (ConnectionManager ) {
if (manager == null) {
manager = new ConnectionManager ();
}
}
}
}
public Connection getConnection() {
return conn;
}
}
Pour le user / password tu peux utiliser des properties ou
pré-initialiser la classe avec les bonnes valeurs.
Pour avoir ta connexion tu utilises la ligne suiivante :
Connection conn = ConnectionManager.getManager().getConnection();
La connexion n'est créée qu'une seule fois et partager par toutes les
classes. Autres remarques : pour les acces aux bases de données il vaut
mieux utiliser un gestionnaire de connexion qui créée et libère les
connexions d'une manière plus transparente.
Philippe Delrieu
Cybernomade
Sebastien Cesbron wrote:
> Le problème c'est que tu utilises conn qui n'est pas static dans des
> méthodes static. Tu as deux solutions pour résoudre ton problème
>
> - tu ne mets pas ta méthode doMySQLconnection static
> - tu veux absolument la mettre static. Dans ce cas tu utilises une
> variable locale à la méthode et tu retournes une Connection et tu
> l'utiliseras dans ton code en faisant conn = doMySQLconnection(...)
>
> Seb
>
> Aurélien Mazurie wrote:
>
>>
>> Grrr... Je désespère de trouver une réponse à un problème tout
>> simple, dû au fait que je débute en Java... Je suis sûr que vous
>> allez trouver ça simplissime:
>> J'ai une classe principale qui contient des variables qui seront
>> utilisées par toutes les classes filles appellées (ces classes
>> correspondent à des formulaires, des boîtes de dialogues, etc.). Ces
>> variables sont appellées à changer (par exemple: la classe mère
>> contient une variable indiquant le nombre de fenêtres ouvertes, et
>> chaque classe fille doit y accéder pour pouvoir l'incrémenter ou la
>> décrémenter). Le problème est que le compilateur me sort toujours des
>> choses comme "il faut que votre variable soit déclarée comme statique
>> pour être appellée". Pénible ! Je ne veux pas de variable statique...
>>
>> Vous avez ci-dessous un extrait de mon code: je veux "partager" la
>> variable conn entre toutes les classes filles appellées à partir de la
>> classe mère MainFrame (qui est elle même appellée par la class
>> principale du programme). J'ai lu quelque part que l'on ne pouvait pas
>> le faire directement, donc j'ai créé dans la classe appelante
>> (MainFrame) une fonction "getConnection" qui renvoie la valeur de conn
>> (et "doMySQLconnection" qui la définie). A ce stade, pfff... J'ai tout
>> essayé. Si je ne déclare pas les fonctions comme statiques, dans les
>> classes filles j'ai un message "A reference to an instance of class
>> MainFrame is required to access this non static member of it" lorsque
>> j'essaye de les appeller (par le biais d'un "autre_conn =
>> MainFrame.getConnection()")... Si je les déclare comme statiques, comme
>> ci-dessous, j'ai le même problème avec la variable conn... Snif
>> ! Je veux bien indiquer une instance active de MainFrame, mais
>> comment on fait ça ?
>>
>> Aurélien Mazurie
>>
>> public class MainFrame extends JFrame
>> {
>> // Acces a la base MySQL
>> private Connection conn;
>>
>> public static void doMySQLconnection (String host, String user,
>> String password)
>> {
>> try { Class.forName("org.gjt.mm.mysql.Driver"); }
>> catch (java.lang.ClassNotFoundException e)
>> {
>> System.err.println(" Erreur ClassNotFoundException: ");
>> System.err.println(" " + e.getMessage());
>> }
>>
>> try { conn = DriverManager.getConnection("jdbc:mysql:///mabase",
>> "", ""); }
>> catch (SQLException ex)
>> {
>> System.err.println(" Erreur SQLException:");
>> System.err.println(" " + ex.getLocalizedMessage() + "\n (erreur
>> " + ex.getErrorCode() + ")");
>> }
>> }
>>
>> public static Connection getConnection ()
>> {
>> return conn;
>> }
>>
>> ...
>>
>>
>
>
>
> ________________________________________________________________________
> ______
>
> ifrance.com, l'email gratuit le plus complet de l'Internet !
> vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
> http://www.ifrance.com/_reloc/email.emailif
>
 |
 |
Attention, si ExpClass est une classe fille de MainFrame (ie une classe
dérivée), tu dois la déclarer de la façon suivante : public class ExpClass
extends MainFrame { ... }
Mais je ne pense pas que ce soit ce que tu veux faire. Si c'est dans
MainFrame que tu instancie une classe ExpClass et que tu veux avoir accès
à partir de ton objet ExpClass créé à l'objet MainFrame qui l'a créé, je
te conseillerais de déclaré un attribut mainFrame à ta classe ExpClass et
un constructeur ExpClass(MainFrame mf). public class ExpClass extends
JFrame {
protected MainFrame mainFrame ;
public ExpClass (MainFrame mf) {
mainFrame = mf ;
...
}
}
Puis dans MainFrame, tu appelles ton constructeur avec new ExpClass(this)
;
Ca rejoint une idée proposée précédement mais je ne sais ni c'est une
bonne méthode ni si ça répond à ta question. A toi de voir si ça t'aide.
Jérôme.
-----Message d'origine-----
De : Aurélien Mazurie [mailto:aurelien.mazurie@free.fr]
Envoyé : mardi 28 mai 2002 14:26
À : java@u-strasbg.fr
Objet : Re: Portée des variables
Je ne cherche pas à avoir mes fonctions getConnection() et
doMySQLconnection() comme statiques; j'ai juste tenté pour voir si le
compilateur l'acceptait. Je l'ai d'ailleurs retiré. Mais le pb. c'est que
maintenant je ne sais pas comment appeler ces fonctions à partir des
classes filles.
Par exemple, dans la classe fille, voilà le problème:
public class ExpClass extends JFrame
{
public ExpClass ()
{
Connection new_conn = [quoi mettre ici ?].getConnection();
...
La classe mère qui appelle ExpClass s'appelle MainFrame, et j'ai essayé
MainFrame.this, mainFrame.this ... pour appeller getConnection dans
ExpClass. Rien ne marche. (note: mainFrame correspond à l'objet créé lors
de l'appel de MainFrame par la classe principale du programme (via
MainFrame mainFrame = new MainFram() ))
Aurélien
Le mardi 28 mai 2002, à 04:01 , Sebastien Cesbron a écrit :
> Le problème c'est que tu utilises conn qui n'est pas static dans des
> méthodes static. Tu as deux solutions pour résoudre ton problème
>
> - tu ne mets pas ta méthode doMySQLconnection static
> - tu veux absolument la mettre static. Dans ce cas tu utilises une
> variable locale à la méthode et tu retournes une Connection et tu
> l'utiliseras dans ton code en faisant conn = doMySQLconnection(...)
>
> Seb
>
> Aurélien Mazurie wrote:
>> Grrr... Je désespère de trouver une réponse à un problème tout simple,
>> dû au fait que je débute en Java... Je suis sûr que vous allez trouver
>> ça simplissime: J'ai une classe principale qui contient des variables
>> qui seront utilisées par toutes les classes filles appellées (ces
>> classes correspondent à des formulaires, des boîtes de dialogues,
>> etc.). Ces variables sont appellées à changer (par exemple: la classe
>> mère contient une variable indiquant le nombre de fenêtres ouvertes, et
>> chaque classe fille doit y accéder pour pouvoir l'incrémenter ou la
>> décrémenter). Le problème est que le compilateur me sort toujours des
>> choses comme "il faut que votre variable soit déclarée comme statique
>> pour être appellée". Pénible ! Je ne veux pas de variable statique...
>> Vous avez ci-dessous un extrait de mon code: je veux "partager" la
>> variable conn entre toutes les classes filles appellées à partir de la
>> classe mère MainFrame (qui est elle même appellée par la class
>> principale du programme). J'ai lu quelque part que l'on ne pouvait pas
>> le faire directement, donc j'ai créé dans la classe appelante
>> (MainFrame) une fonction "getConnection" qui renvoie la valeur de conn
>> (et "doMySQLconnection" qui la définie). A ce stade, pfff... J'ai tout
>> essayé. Si je ne déclare pas les fonctions comme statiques, dans les
>> classes filles j'ai un message "A reference to an instance of class
>> MainFrame is required to access this non static member of it" lorsque
>> j'essaye de les appeller (par le biais d'un "autre_conn =
>> MainFrame.getConnection()")... Si je les déclare comme statiques, comme
>> ci-dessous, j'ai le même problème avec la variable conn... Snif ! Je
>> veux bien indiquer une instance active de MainFrame, mais comment on
>> fait ça ?
>> Aurélien Mazurie
>> public class MainFrame extends JFrame
>> {
>> // Acces a la base MySQL
>> private Connection conn;
>> public static void doMySQLconnection (String host, String user,
>> String password)
>> {
>> try { Class.forName("org.gjt.mm.mysql.Driver"); }
>> catch (java.lang.ClassNotFoundException e)
>> {
>> System.err.println(" Erreur ClassNotFoundException: ");
>> System.err.println(" " + e.getMessage());
>> }
>> try { conn =
>> DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
>> catch (SQLException ex)
>> {
>> System.err.println(" Erreur SQLException:");
>> System.err.println(" " + ex.getLocalizedMessage() + "\n
>> (erreur " + ex.getErrorCode() + ")");
>> }
>> }
>> public static Connection getConnection ()
>> {
>> return conn;
>> }
>> ...
>
>
>
__________________________________________________________________________
__ __ > ifrance.com, l'email gratuit le plus complet de l'Internet ! > vos
emails depuis un navigateur, en POP3, sur Minitel, sur le WAP... >
http://www.ifrance.com/_reloc/email.emailif > > >
 |
 |
Impeccable ! C'est ca que je cherchais !
Merci =)
Aurélien
Le mardi 28 mai 2002, à 02:49 , Truffot Jérôme a écrit :
> Attention, si ExpClass est une classe fille de MainFrame (ie une classe
> dérivée), tu dois la déclarer de la façon suivante : public class
> ExpClass extends MainFrame { ...
> }
>
> Mais je ne pense pas que ce soit ce que tu veux faire. Si c'est dans
> MainFrame que tu instancie une classe ExpClass et que tu veux avoir
> accès à partir de ton objet ExpClass créé à l'objet MainFrame qui l'a
> créé, je te conseillerais de déclaré un attribut mainFrame à ta classe
> ExpClass et un constructeur ExpClass(MainFrame mf). public class
> ExpClass extends JFrame {
> protected MainFrame mainFrame ;
>
> public ExpClass (MainFrame mf) {
> mainFrame = mf ;
> ...
> }
> }
> Puis dans MainFrame, tu appelles ton constructeur avec new
> ExpClass(this) ;
>
> Ca rejoint une idée proposée précédement mais je ne sais ni c'est une
> bonne méthode ni si ça répond à ta question. A toi de voir si ça t'aide.
>
> Jérôme.
>
> -----Message d'origine-----
> De : Aurélien Mazurie [mailto:aurelien.mazurie@free.fr]
> Envoyé : mardi 28 mai 2002 14:26
> À : java@u-strasbg.fr
> Objet : Re: Portée des variables
>
>
>
> Je ne cherche pas à avoir mes fonctions getConnection() et
> doMySQLconnection() comme statiques; j'ai juste tenté pour voir si le
> compilateur l'acceptait. Je l'ai d'ailleurs retiré. Mais le pb. c'est
> que maintenant je ne sais pas comment appeler ces fonctions à partir des
> classes filles.
>
> Par exemple, dans la classe fille, voilà le problème:
>
> public class ExpClass extends JFrame
> {
> public ExpClass ()
> {
> Connection new_conn = [quoi mettre ici ?].getConnection();
> ...
>
> La classe mère qui appelle ExpClass s'appelle MainFrame, et j'ai essayé
> MainFrame.this, mainFrame.this ... pour appeller getConnection dans
> ExpClass. Rien ne marche. (note: mainFrame correspond à l'objet créé
> lors de l'appel de MainFrame par la classe principale du programme (via
> MainFrame mainFrame = new MainFram() ))
>
> Aurélien
>
> Le mardi 28 mai 2002, à 04:01 , Sebastien Cesbron a écrit :
>
>> Le problème c'est que tu utilises conn qui n'est pas static dans des
>> méthodes static. Tu as deux solutions pour résoudre ton problème
>>
>> - tu ne mets pas ta méthode doMySQLconnection static
>> - tu veux absolument la mettre static. Dans ce cas tu utilises une
>> variable locale à la méthode et tu retournes une Connection et tu
>> l'utiliseras dans ton code en faisant conn = doMySQLconnection(...)
>>
>> Seb
>>
>> Aurélien Mazurie wrote:
>>> Grrr... Je désespère de trouver une réponse à un problème tout simple,
>>> dû au fait que je débute en Java... Je suis sûr que vous allez trouver
>>> ça simplissime: J'ai une classe principale qui contient des variables
>>> qui seront utilisées par toutes les classes filles appellées (ces
>>> classes correspondent à des formulaires, des boîtes de dialogues,
>>> etc.). Ces variables sont appellées à changer (par exemple: la classe
>>> mère contient une variable indiquant le nombre de fenêtres ouvertes,
>>> et chaque classe fille doit y accéder pour pouvoir l'incrémenter ou la
>>> décrémenter). Le problème est que le compilateur me sort toujours des
>>> choses comme "il faut que votre variable soit déclarée comme statique
>>> pour être appellée". Pénible ! Je ne veux pas de variable statique...
>>> Vous avez ci-dessous un extrait de mon code: je veux "partager" la
>>> variable conn entre toutes les classes filles appellées à partir de la
>>> classe mère MainFrame (qui est elle même appellée par la class
>>> principale du programme). J'ai lu quelque part que l'on ne pouvait pas
>>> le faire directement, donc j'ai créé dans la classe appelante
>>> (MainFrame) une fonction "getConnection" qui renvoie la valeur de conn
>>> (et "doMySQLconnection" qui la définie). A ce stade, pfff... J'ai tout
>>> essayé. Si je ne déclare pas les fonctions comme statiques, dans les
>>> classes filles j'ai un message "A reference to an instance of class
>>> MainFrame is required to access this non static member of it" lorsque
>>> j'essaye de les appeller (par le biais d'un "autre_conn =
>>> MainFrame.getConnection()")... Si je les déclare comme statiques,
>>> comme ci-dessous, j'ai le même problème avec la variable conn... Snif
>>> ! Je veux bien indiquer une instance active de MainFrame, mais comment
>>> on fait ça ?
>>> Aurélien Mazurie
>>> public class MainFrame extends JFrame
>>> {
>>> // Acces a la base MySQL
>>> private Connection conn;
>>> public static void doMySQLconnection (String host, String user,
>>> String password)
>>> {
>>> try { Class.forName("org.gjt.mm.mysql.Driver"); }
>>> catch (java.lang.ClassNotFoundException e)
>>> {
>>> System.err.println(" Erreur ClassNotFoundException: ");
>>> System.err.println(" " + e.getMessage());
>>> }
>>> try { conn =
>>> DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
>>> catch (SQLException ex)
>>> {
>>> System.err.println(" Erreur SQLException:");
>>> System.err.println(" " + ex.getLocalizedMessage() + "\n
>>> (erreur " + ex.getErrorCode() + ")");
>>> }
>>> }
>>> public static Connection getConnection ()
>>> {
>>> return conn;
>>> }
>>> ...
>>
>>
>>
> ________________________________________________________________________
> ____ __
>> ifrance.com, l'email gratuit le plus complet de l'Internet !
>> vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
>> http://www.ifrance.com/_reloc/email.emailif
>>
>>
>>
>
 |
 |
Le problème c'est que tu utilises conn qui n'est pas static dans des
méthodes static. Tu as deux solutions pour résoudre ton problème
- tu ne mets pas ta méthode doMySQLconnection static
- tu veux absolument la mettre static. Dans ce cas tu utilises une
variable locale à la méthode et tu retournes une Connection et tu
l'utiliseras dans ton code en faisant conn = doMySQLconnection(...)
Seb
Aurélien Mazurie wrote:
>
> Grrr... Je désespère de trouver une réponse à un problème tout simple,
> dû au fait que je débute en Java... Je suis sûr que vous allez trouver
> ça simplissime: J'ai une classe principale qui contient des variables
> qui seront utilisées par toutes les classes filles appellées (ces
> classes correspondent à des formulaires, des boîtes de dialogues, etc.).
> Ces variables sont appellées à changer (par exemple: la classe mère
> contient une variable indiquant le nombre de fenêtres ouvertes, et
> chaque classe fille doit y accéder pour pouvoir l'incrémenter ou la
> décrémenter). Le problème est que le compilateur me sort toujours des
> choses comme "il faut que votre variable soit déclarée comme statique
> pour être appellée". Pénible ! Je ne veux pas de variable statique...
>
> Vous avez ci-dessous un extrait de mon code: je veux "partager" la
> variable conn entre toutes les classes filles appellées à partir de la
> classe mère MainFrame (qui est elle même appellée par la class
> principale du programme). J'ai lu quelque part que l'on ne pouvait pas
> le faire directement, donc j'ai créé dans la classe appelante
> (MainFrame) une fonction "getConnection" qui renvoie la valeur de conn
> (et "doMySQLconnection" qui la définie). A ce stade, pfff... J'ai tout
> essayé. Si je ne déclare pas les fonctions comme statiques, dans les
> classes filles j'ai un message "A reference to an instance of class
> MainFrame is required to access this non static member of it" lorsque
> j'essaye de les appeller (par le biais d'un "autre_conn =
> MainFrame.getConnection()")... Si je les déclare comme statiques, comme
> ci-dessous, j'ai le même problème avec la variable conn... Snif ! Je
> veux bien indiquer une instance active de MainFrame, mais comment on
> fait ça ?
>
> Aurélien Mazurie
>
> public class MainFrame extends JFrame
> {
> // Acces a la base MySQL
> private Connection conn;
>
> public static void doMySQLconnection (String host, String user, String
>
> password)
> {
> try { Class.forName("org.gjt.mm.mysql.Driver"); }
> catch (java.lang.ClassNotFoundException e)
> {
> System.err.println(" Erreur ClassNotFoundException: ");
> System.err.println(" " + e.getMessage());
> }
>
> try { conn = DriverManager.getConnection("jdbc:mysql:///mabase", "",
>
> ""); }
> catch (SQLException ex)
> {
> System.err.println(" Erreur SQLException:");
> System.err.println(" " + ex.getLocalizedMessage() + "\n (erreur "
> + ex.getErrorCode() + ")");
> }
> }
>
> public static Connection getConnection ()
> {
> return conn;
> }
>
> ...
>
>
__________________________________________________________________________
____ ifrance.com, l'email gratuit le plus complet de l'Internet ! vos
emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
http://www.ifrance.com/_reloc/email.emailif
 |
 |
Ce n'est pas grave sur le même modèle tu ne fais pas la connection dans le
constructeur mais tu fournis deux méthodes connect(user, pass) et
disconnect. Si l'utilisateur appel getConnection() alors que la connexion
n'est pas ouverte tu lances une exception.
public void connect(String user, String pass) throws SQLException { ....
}
public void disconnect() throws SQLExeption {
...
}
public Connection getConnection() throws NoConnectionAvailableException
{
...
}
Autre remarque : souvent il n'est pas très judicieux de catcher des
exceptions dans une méthode sans les remonter surtout sur ce type de
composant. Si il y a un pb lors de la connexion la classe qui réalise
l'appel ne le sait pas.
Philippe Delrieu
Cybernomade
Aurélien Mazurie wrote:
>
> En fait l'utilisateur doit pouvoir se déconnecter de la base en cours
> pour se reconnecter à une autre (par contre il n'est pas possible
> d'avoir deux connections simultanées). Donc la variable "conn" ne doit
> pas être figée.
>
> Aurélien
>
> Le mardi 28 mai 2002, à 02:31 , Philippe Delrieu a écrit :
>
>> D'une manière générale lorsque l'on veut partager une ressource ou une
>> variable entre plusieurs instances de classes et être sûre que la
>> ressource ne sera initialisée qu'une fois (c'est souvent le cas avec
>> les connexion aux bases de données) il faut utiliser le pattern
>> singleton. Ce pattern garanti la création unique d'une classe et son
>> partage parmis les autres. Le modèle dans ton cas peut être le suivant
>> :
>>
>> public ConnectionManager {
>> private staitc ConnectionManager manager;
>> private Connection conn;
>>
>> private ConnectionManager () {
>> try { Class.forName("org.gjt.mm.mysql.Driver"); }
>> catch (java.lang.ClassNotFoundException e)
>> { System.err.println(" Erreur
>> ClassNotFoundException: ");
>> System.err.println(" " + e.getMessage());
>> }
>>
>> try { conn = DriverManager.getConnection("jdbc:mysql:///mabase",
>> "", ""); }
>> catch (SQLException ex)
>> {
>> System.err.println(" Erreur SQLException:");
>> System.err.println(" " + ex.getLocalizedMessage() + "\n (erreur
>> " + ex.getErrorCode() + ")");
>> } }
>>
>> public static ConnectionManager getManager() {
>> if (manager == null) { synchronized
>> (ConnectionManager ) {
>> if (manager == null) {
>> manager = new ConnectionManager (); }
>> }
>> }
>> }
>>
>> public Connection getConnection() {
>> return conn;
>> }
>> }
>>
>> Pour le user / password tu peux utiliser des properties ou
>> pré-initialiser la classe avec les bonnes valeurs.
>>
>> Pour avoir ta connexion tu utilises la ligne suiivante :
>> Connection conn = ConnectionManager.getManager().getConnection();
>>
>> La connexion n'est créée qu'une seule fois et partager par toutes les
>> classes. Autres remarques : pour les acces aux bases de données il vaut
>> mieux utiliser un gestionnaire de connexion qui créée et libère les
>> connexions d'une manière plus transparente.
>>
>> Philippe Delrieu
>> Cybernomade
>>
>> Sebastien Cesbron wrote:
>>
>>> Le problème c'est que tu utilises conn qui n'est pas static dans des
>>> méthodes static. Tu as deux solutions pour résoudre ton problème
>>>
>>> - tu ne mets pas ta méthode doMySQLconnection static
>>> - tu veux absolument la mettre static. Dans ce cas tu utilises une
>>> variable locale à la méthode et tu retournes une Connection et tu
>>> l'utiliseras dans ton code en faisant conn = doMySQLconnection(...)
>>>
>>> Seb
>>>
>>> Aurélien Mazurie wrote:
>>>
>>>>
>>>> Grrr... Je désespère de trouver une réponse à un problème tout
>>>> simple, dû au fait que je débute en Java... Je suis sûr que vous
>>>> allez trouver ça simplissime: J'ai une classe principale qui contient
>>>> des variables qui seront utilisées par toutes les classes filles
>>>> appellées (ces classes correspondent à des formulaires, des boîtes de
>>>> dialogues, etc.). Ces variables sont appellées à changer (par
>>>> exemple: la classe mère contient une variable indiquant le nombre de
>>>> fenêtres ouvertes, et chaque classe fille doit y accéder pour pouvoir
>>>> l'incrémenter ou la décrémenter). Le problème est que le compilateur
>>>> me sort toujours des choses comme "il faut que votre variable soit
>>>> déclarée comme statique pour être appellée". Pénible ! Je ne veux pas
>>>> de variable statique...
>>>>
>>>> Vous avez ci-dessous un extrait de mon code: je veux "partager" la
>>>> variable conn entre toutes les classes filles appellées à partir de
>>>> la classe mère MainFrame (qui est elle même appellée par la class
>>>> principale du programme). J'ai lu quelque part que l'on ne pouvait
>>>> pas le faire directement, donc j'ai créé dans la classe appelante
>>>> (MainFrame) une fonction "getConnection" qui renvoie la valeur de
>>>> conn (et "doMySQLconnection" qui la définie). A ce stade, pfff...
>>>> J'ai tout essayé. Si je ne déclare pas les fonctions comme statiques,
>>>> dans les classes filles j'ai un message "A reference to an instance
>>>> of class MainFrame is required to access this non static member of
>>>> it" lorsque j'essaye de les appeller (par le biais d'un "autre_conn =
>>>> MainFrame.getConnection()")... Si je les déclare comme statiques,
>>>> comme ci-dessous, j'ai le même problème avec la variable conn... Snif
>>>> ! Je veux bien indiquer une instance active de MainFrame, mais
>>>> comment on fait ça ?
>>>>
>>>> Aurélien Mazurie
>>>>
>>>> public class MainFrame extends JFrame
>>>> {
>>>> // Acces a la base MySQL
>>>> private Connection conn;
>>>>
>>>> public static void doMySQLconnection (String host, String user,
>>>> String password)
>>>> {
>>>> try { Class.forName("org.gjt.mm.mysql.Driver"); }
>>>> catch (java.lang.ClassNotFoundException e)
>>>> {
>>>> System.err.println(" Erreur ClassNotFoundException: ");
>>>> System.err.println(" " + e.getMessage());
>>>> }
>>>>
>>>> try { conn =
>>>> DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
>>>> catch (SQLException ex)
>>>> {
>>>> System.err.println(" Erreur SQLException:");
>>>> System.err.println(" " + ex.getLocalizedMessage() + "\n
>>>> (erreur " + ex.getErrorCode() + ")");
>>>> }
>>>> }
>>>>
>>>> public static Connection getConnection ()
>>>> {
>>>> return conn;
>>>> }
>>>>
>>>> ...
>>>>
>>>>
>>>
>>>
>>>
>>> ______________________________________________________________________
>>> ________
>>>
>>> ifrance.com, l'email gratuit le plus complet de l'Internet !
>>> vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
>>> http://www.ifrance.com/_reloc/email.emailif
>>>
>>
>>
>>
>>
>