Bonjour,
NetBeans me met un wanring chaque fois que j'utilise une méthode non finale dans un constructeur.
Où est le problème ?
Au contraire, je trouve ça très pratique.
Cela permet à des sous-classes de s'initier de manière customisée.
Version imprimable
Bonjour,
NetBeans me met un wanring chaque fois que j'utilise une méthode non finale dans un constructeur.
Où est le problème ?
Au contraire, je trouve ça très pratique.
Cela permet à des sous-classes de s'initier de manière customisée.
C'est quoi la solution ?
Exemple, j'ai une application Swing dont son initialisation j'ai écris
Je veux une version spéciale de cette application dans laquelle j'aurai un panneau légèrement revu.Code:
1
2
3
4
5
6
7
8
9
10 class A extends JFrame { final JPanel; public A() { JPanel panel=createPanel(); } JPanel createPanel() { return new PanelX(); } }
Je crée donc donc une sous classe de mon
Une solution avec des factory serait-elle mieux ? Sauf que cela ne fonctionne pas avec les attributs "final"Code:
1
2
3
4
5
6
7
8
9
10 class B extends A { public B() { super() } @Overide JPanel createPanel() { return new PanelY(); } }
Celle qui fait le taf'.
Dans ton exemple, il y a le simple :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 class A extends JFrame { final JPanel; protected A(Jpanel panel) { this.panel = panel; } public A() { this(new PanelX()); } }
Ça peut dans des cas plus compliqués.Code:
1
2
3
4
5 class B extends A { public B() { super(new PanelY()); } }
Pas plus que d'habitude.
Deja, commencons par le probleme. Le cas suivant, par exemple, ne marcherait pas :
Ca ne saute pas aux yeux mais le probleme, c'est que les variables de classes de B sont initialisées apres celles de A. Donc au moment de l'appel de createPanel dans le constructeur du pere de B, monPanel sera null. Dans ce cas, ca va générer une NullPointerException donc c'est facilement compréhensible mais dans le cas d'une modification de variable utilisée par le pere ou quelque chose de plus complexe, ca risque d'etre moins trivial a debugger.
L'attribut n'a pas besoin d'etre "final" dans le cas d'une factory. Si l'objectif de dériver la classe est seulement de creer des panels différents, oui, ca peut etre une solution. Pour un probleme qui ressemble, j'avais choisi la solution d'avoir un constructeur tres simple mais d'imposer l'appel à une fonction "build" qui fait en gros ce que fait ton constructeur. Ca donne quelque chose comme ca :
Et la, ca marche.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 class A extends JFrame { final JPanel; public A() { } public void build() { JPanel panel=createPanel(); } JPanel createPanel() { return new PanelX(); } } class B extends A { JPanel monPan = new PanelB(); public B() { super() } @Overide JPanel createPanel() { return monPanel; } }
Je vois où le problème... Je crois que je vais abandonner cette mauvaise "bonne" pratique... Reste à voir comment au cas par cas.
J'hésitais aussi aux méthodes de type "build()". Mais ça rend plus compliqué le travail avec des GUI builder comme celui de Netbeans...
Quant aux paramètres, ça marche s'il y en a 1 ou 2 après ça devient compliqué...
Merci pour les pistes.
Personellement, dans les applications plus complexes, quand ça s'y prête, j'utilise cette solution
Mais ça ne marche que si on a intégré spring à l'application ;)Code:
1
2
3
4
5
6 @Configurable public class X { @PostConstruct protected void init(){ } }