Hostylez Reveal yer trve dark attitude :3


19
Nov/09
2

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).

  1. Base de donnée XML native développée par le CEA, qui fera certainement l'objet d'un prochain article []

Author: Rykian

Etudiant en Licence Professionnelle Créations et Réalisations de Services et Produits Multimédia option "E-Learning" à l'IUT de Laval, suite à un DUT Services et Réseaux de Communication. Fortement intéressé par la musique, mais aussi par Internet (social networks, développement)
Filed under: Dev
Comments (2) Trackbacks (0)
  1. 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é.

    ReplyReply
  2. 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é synchronized ne règle pas le problème ?

    ReplyReply

Leave a comment


No trackbacks yet.