Bonjour
J'ai une application constituée de 2 classes: la classe principale
(MediatorJS), une class pour choisir un element (ListShapeJS), et une
classe pour dessiner (DrawShapeJS).
ListShapeJS envoie des informations à DrawShapeJS par l'intermédiatire
de MediatorJS.
Voici la structure de mes classes:
public class MediatorJS/* extends JFrame*/ {
private static MediatorJS application;
private ShapeDrawJS drawComponent;
private ShapeListJS listComponent;
public static void main(String args[]) {
application = new MediatorJS();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static MediatorJS getInstance() {
return application;
}
}
et une des autres classe:
public class ShapeDrawJS extends Canvas {
MediatorJS mediator;
public ShapeDrawJS(String startShape) {
super();
....
mediator = MediatorJS.getInstance();
}
}
Probleme: getInstance vaut null.
Je me suis dit que c'était normal, car j'ai dans l'order:
->appel de MediatorJS dans main()
->creation de ShapeDrawJS
->applet de getInstance
->application prend sa valeur
Donc j'ai decide de modifier MediatorJS:
public class MediatorJS {
private static MediatorJS application;
private ShapeDrawJS drawComponent;
private ShapeListJS listComponent;
public JFrame frame;
public MediatorJS() {
// empty
}
public void createFrame() {
frame = new JFrame("Mediator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Thomas Nguyen
On Sat, 23 Oct 2004 15:59:54 -0700, julien wrote:
Probleme: getInstance vaut null. Je me suis dit que c'était normal
Exact. Tu as compris comment le régler, donc c'est plus un problème. ;)
Mais là "non-static method createFrame() cannot be referenced from a static context"
Normal, tu appelles la méthode d'instance createFrame() depuis une méthode de classe (mot-clé static). Le compilo ne sait pas sur quelle instance appeler createFrame().
Essaie avec: public static void main(String args[]) { application = new MediatorJS(); application.createFrame(); }
Au passage, une remarque sur le style: Créer un singleton comme ça me plait moyennement. C'est généralement une source d'ennuis. Mais bon, je sais pas comment tu l'utilises, alors je peux pas juger.
Je voudrais eviter de créer une classe supplémentaire pour le mediator. Est-ce possible?
Probablement. Qu'est-ce qui t'en empêche?
On Sat, 23 Oct 2004 15:59:54 -0700, julien wrote:
Probleme: getInstance vaut null.
Je me suis dit que c'était normal
Exact.
Tu as compris comment le régler, donc c'est plus un problème. ;)
Mais là "non-static method createFrame() cannot be referenced from a
static context"
Normal, tu appelles la méthode d'instance createFrame() depuis une
méthode de classe (mot-clé static). Le compilo ne sait pas sur quelle
instance appeler createFrame().
Essaie avec:
public static void main(String args[]) {
application = new MediatorJS();
application.createFrame();
}
Au passage, une remarque sur le style:
Créer un singleton comme ça me plait moyennement. C'est généralement
une source d'ennuis.
Mais bon, je sais pas comment tu l'utilises, alors je peux pas juger.
Je voudrais eviter de créer une classe supplémentaire pour le mediator.
Est-ce possible?
Probleme: getInstance vaut null. Je me suis dit que c'était normal
Exact. Tu as compris comment le régler, donc c'est plus un problème. ;)
Mais là "non-static method createFrame() cannot be referenced from a static context"
Normal, tu appelles la méthode d'instance createFrame() depuis une méthode de classe (mot-clé static). Le compilo ne sait pas sur quelle instance appeler createFrame().
Essaie avec: public static void main(String args[]) { application = new MediatorJS(); application.createFrame(); }
Au passage, une remarque sur le style: Créer un singleton comme ça me plait moyennement. C'est généralement une source d'ennuis. Mais bon, je sais pas comment tu l'utilises, alors je peux pas juger.
Je voudrais eviter de créer une classe supplémentaire pour le mediator. Est-ce possible?
Probablement. Qu'est-ce qui t'en empêche?
julien
Thomas Nguyen wrote:
On Sat, 23 Oct 2004 15:59:54 -0700, julien wrote:
Probleme: getInstance vaut null. Je me suis dit que c'était normal
Exact. Tu as compris comment le régler, donc c'est plus un problème. ;) Ben si, voir le problème plus bas :-)
Mais là "non-static method createFrame() cannot be referenced from a static context"
Normal, tu appelles la méthode d'instance createFrame() depuis une méthode de classe (mot-clé static). Le compilo ne sait pas sur quelle instance appeler createFrame().
Essaie avec: public static void main(String args[]) { application = new MediatorJS(); application.createFrame(); } OK, merci
Au passage, une remarque sur le style: Créer un singleton comme ça me plait moyennement. C'est généralement une source d'ennuis. Mais bon, je sais pas comment tu l'utilises, alors je peux pas juger. Le signleton, c'est application.createFrame(); ? Il m'a semblé que
c'était la seule manière de régler mon sinstance nulle, puis que les objects ne peuvent pas être appelés dans MainJS().
Je voudrais eviter de créer une classe supplémentaire pour le mediator. Est-ce possible?
Probablement. Qu'est-ce qui t'en empêche?
Le problème plus haut! :-)
Thomas Nguyen wrote:
On Sat, 23 Oct 2004 15:59:54 -0700, julien wrote:
Probleme: getInstance vaut null.
Je me suis dit que c'était normal
Exact.
Tu as compris comment le régler, donc c'est plus un problème. ;)
Ben si, voir le problème plus bas :-)
Mais là "non-static method createFrame() cannot be referenced from a
static context"
Normal, tu appelles la méthode d'instance createFrame() depuis une
méthode de classe (mot-clé static). Le compilo ne sait pas sur quelle
instance appeler createFrame().
Essaie avec:
public static void main(String args[]) {
application = new MediatorJS();
application.createFrame();
}
OK, merci
Au passage, une remarque sur le style:
Créer un singleton comme ça me plait moyennement. C'est généralement
une source d'ennuis.
Mais bon, je sais pas comment tu l'utilises, alors je peux pas juger.
Le signleton, c'est application.createFrame(); ? Il m'a semblé que
c'était la seule manière de régler mon sinstance nulle, puis que les
objects ne peuvent pas être appelés dans MainJS().
Je voudrais eviter de créer une classe supplémentaire pour le mediator.
Est-ce possible?
Probleme: getInstance vaut null. Je me suis dit que c'était normal
Exact. Tu as compris comment le régler, donc c'est plus un problème. ;) Ben si, voir le problème plus bas :-)
Mais là "non-static method createFrame() cannot be referenced from a static context"
Normal, tu appelles la méthode d'instance createFrame() depuis une méthode de classe (mot-clé static). Le compilo ne sait pas sur quelle instance appeler createFrame().
Essaie avec: public static void main(String args[]) { application = new MediatorJS(); application.createFrame(); } OK, merci
Au passage, une remarque sur le style: Créer un singleton comme ça me plait moyennement. C'est généralement une source d'ennuis. Mais bon, je sais pas comment tu l'utilises, alors je peux pas juger. Le signleton, c'est application.createFrame(); ? Il m'a semblé que
c'était la seule manière de régler mon sinstance nulle, puis que les objects ne peuvent pas être appelés dans MainJS().
Je voudrais eviter de créer une classe supplémentaire pour le mediator. Est-ce possible?
Probablement. Qu'est-ce qui t'en empêche?
Le problème plus haut! :-)
Thomas Nguyen
On Sat, 23 Oct 2004 19:38:31 -0700, julien wrote:
Le signleton, c'est application.createFrame(); ? Il m'a semblé que c'était la seule manière de régler mon sinstance nulle, puis que les objects ne peuvent pas être appelés dans MainJS().
Un singleton, c'est quand une classe a une et une seule instance. En gros, c'est une manière orientée object de faire une variable globale.
Dans ton cas, c'est cette variable: private static MediatorJS application;
(c'est pas un singleton pur et dur comme ceux dont on parle dans la littérature, mais ça y ressemble sacrément)
L'utilisation d'un singleton n'a jamais résolu les NullPointerException.
C'est même d'avoir créé un singleton qui t'as causé des problèmes dès le début.
La solution simple et propre aurais été de passer l'instance de Mediator à tes objets ShapeListJS et ShapeDrawJS en paramètre du constructeur.
public MediatorJS() { super("Mediator"); (...) listComponent = new ShapeListJS("line", this); drawComponent = new ShapeDrawJS("line", this); (...) }
Ou tu aurais même pu passer cette référence à Mediator plus tard, après le constructeur, avec des méthodes setMediator(). (à condition que ShapeListJS et ShapeDrawJS n'aient pas besoin du mediator tout de suite)
Les solutions sont multiples, et sans connaitre l'architecture et la fonction de ton programme, c'est impossible de savoir quelle est la meilleure solution. Mais ce qui est sûr, c'est qu'un singleton est rarement la meilleure.
C'est pas bien grave. Ca marche quand même, alors t'inquiète pas trop.
Je voudrais eviter de créer une classe supplémentaire pour le mediator. Est-ce possible?
Probablement. Qu'est-ce qui t'en empêche?
Le problème plus haut! :-)
Je vais être chiant et t'asticoter, mais ... et quand le problème sera résolu, qu'est-ce qui t'empêchera de supprimer la classe Mediator? Plus important encore, pourquoi est-ce que tu voudrais t'en débarrasser, de cette classe?
-- Thomas
On Sat, 23 Oct 2004 19:38:31 -0700, julien wrote:
Le signleton, c'est application.createFrame(); ? Il m'a semblé que
c'était la seule manière de régler mon sinstance nulle, puis que les
objects ne peuvent pas être appelés dans MainJS().
Un singleton, c'est quand une classe a une et une seule instance.
En gros, c'est une manière orientée object de faire une variable globale.
Dans ton cas, c'est cette variable:
private static MediatorJS application;
(c'est pas un singleton pur et dur comme ceux dont on parle dans la
littérature, mais ça y ressemble sacrément)
L'utilisation d'un singleton n'a jamais résolu les NullPointerException.
C'est même d'avoir créé un singleton qui t'as causé des problèmes
dès le début.
La solution simple et propre aurais été de passer l'instance de Mediator
à tes objets ShapeListJS et ShapeDrawJS en paramètre du constructeur.
public MediatorJS() {
super("Mediator");
(...)
listComponent = new ShapeListJS("line", this);
drawComponent = new ShapeDrawJS("line", this);
(...)
}
Ou tu aurais même pu passer cette référence à Mediator plus tard,
après le constructeur, avec des méthodes setMediator().
(à condition que ShapeListJS et ShapeDrawJS n'aient pas besoin du
mediator tout de suite)
Les solutions sont multiples, et sans connaitre l'architecture et la
fonction de ton programme, c'est impossible de savoir quelle est la
meilleure solution. Mais ce qui est sûr, c'est qu'un singleton est
rarement la meilleure.
C'est pas bien grave. Ca marche quand même, alors t'inquiète pas trop.
Je voudrais eviter de créer une classe supplémentaire pour le mediator.
Est-ce possible?
Probablement. Qu'est-ce qui t'en empêche?
Le problème plus haut! :-)
Je vais être chiant et t'asticoter, mais ...
et quand le problème sera résolu, qu'est-ce qui t'empêchera de
supprimer la classe Mediator?
Plus important encore, pourquoi est-ce que tu voudrais t'en débarrasser,
de cette classe?
Le signleton, c'est application.createFrame(); ? Il m'a semblé que c'était la seule manière de régler mon sinstance nulle, puis que les objects ne peuvent pas être appelés dans MainJS().
Un singleton, c'est quand une classe a une et une seule instance. En gros, c'est une manière orientée object de faire une variable globale.
Dans ton cas, c'est cette variable: private static MediatorJS application;
(c'est pas un singleton pur et dur comme ceux dont on parle dans la littérature, mais ça y ressemble sacrément)
L'utilisation d'un singleton n'a jamais résolu les NullPointerException.
C'est même d'avoir créé un singleton qui t'as causé des problèmes dès le début.
La solution simple et propre aurais été de passer l'instance de Mediator à tes objets ShapeListJS et ShapeDrawJS en paramètre du constructeur.
public MediatorJS() { super("Mediator"); (...) listComponent = new ShapeListJS("line", this); drawComponent = new ShapeDrawJS("line", this); (...) }
Ou tu aurais même pu passer cette référence à Mediator plus tard, après le constructeur, avec des méthodes setMediator(). (à condition que ShapeListJS et ShapeDrawJS n'aient pas besoin du mediator tout de suite)
Les solutions sont multiples, et sans connaitre l'architecture et la fonction de ton programme, c'est impossible de savoir quelle est la meilleure solution. Mais ce qui est sûr, c'est qu'un singleton est rarement la meilleure.
C'est pas bien grave. Ca marche quand même, alors t'inquiète pas trop.
Je voudrais eviter de créer une classe supplémentaire pour le mediator. Est-ce possible?
Probablement. Qu'est-ce qui t'en empêche?
Le problème plus haut! :-)
Je vais être chiant et t'asticoter, mais ... et quand le problème sera résolu, qu'est-ce qui t'empêchera de supprimer la classe Mediator? Plus important encore, pourquoi est-ce que tu voudrais t'en débarrasser, de cette classe?