Nov/092
Une autre manière de faire un singleton en Java
Je sais, le singleton nuit gravement à la santé de votre code comme certains disent. Mais pour les besoins de ma boîte, je suis en train de développer une nouvelle version de l'API de connection à notre base de donnée préférée (XediX1) et pour des raisons de performance le singleton est préférable.
Habituellement tel qu'on nous l'apprends, ça ressemble plus à ça :
public class MySingleton { private static MySingleton instance; private MySingleton(){} private static MySingleton getInstance(){ if(MySingleton.instance == null) MySingleton.instance = new Singleton(); return MySingleton.instance; } }
En Java il existe un autre moyen plus propre et plus adapté je trouve :
public class MyNewSingleton { private static MyNewSingleton instance; static { MyNewSingleton.instance = new Singleton(); } private MyNewSingleton(){} private static MyNewSingleton getInstance(){ return MyNewSingleton.instance; } }
Lors de l'appel d'une méthode de la classe MyNewSingleton, la machine virtuelle va d'abord s'occuper du code placé à l'intérieur de l'instruction static {} puis va executer le code de la méthode appelé. Ce n'est pas un énorme changement, mais ça évite une condition qui ne m'avait jamais branché (je n'aime malheureusement pas les conditions, dommage pour un développeur).
- Base de donnée XML native développée par le CEA, qui fera certainement l'objet d'un prochain article [↩]
November 20th, 2009
Quand les données nécessaires à l’initialisation du singleton sont présentes au chargement de la classe, c’est effectivement la meilleure solution. ( sui peut aussi s’écrire :
private static final MySingleton instance =new Singleton();
avec un petit final qui fait même joli)
Quand à la condition, elle est très dangereuse car elle n’empêche pas l’initialisation de 2(ou plus) singletons !! en environnement multi-threadé.
November 20th, 2009
Les variables de classes ne sont pour moi que des déclarations, je préfère ne pas leur associer de valeur.
Pour les environnement multi-threadés, le mot clé
synchronizedne règle pas le problème ?