2010-01-05 9 views
9

Quelqu'un peut-il fournir un exemple de modèle singleton et expliquer pourquoi ils sont nécessaires?Implémentation du modèle singleton en Java

+4

Pour accepter des réponses à vos questions, vous devez cliquer sur la coche qui apparaît en gris sous le score d'une réponse: cette marque deviendra verte ce qui signifie que vous l'avez acceptée, voir http://stackoverflow.com/faq –

Répondre

27

Avant d'emprunter la route singleton, reconsidérer. Avez-vous vraiment besoin d'un singleton? Si vous demandez des scénarios lorsque vous avez besoin d'implémenter des singletons, c'est parce que leur besoin ne s'est pas vraiment exprimé. Il vaut mieux ne pas introduire de singletons dans votre base de code simplement parce que c'est cool de suivre les modèles de design.

Clean Code Talks - Global State and Singletons

Once Is Not Enough

Performant Singletons

Cependant, ce qui est vraiment intéressant de savoir est Dependency Injection.

Maintenant, si vous voulez vraiment mettre en œuvre singletons en Java, je recommande ainsi "Effective Java" de Joshua Bloch de leur mise en œuvre:

public class Singleton 
{ 
    public static Singleton getInstance() { 
    return SingletonHolder.instance; 
    } 

    private Singleton() {} 

    private static final class SingletonHolder { 
    static final Singleton instance = new Singleton();  
    } 
} 

Le JLS garantit la machine virtuelle Java ne sera pas initialiser instance jusqu'à ce que quelqu'un appelle getInstance();

Note finale, le Double Checked Locking Pattern is broken in Java up to Java 5. The Java 5 memory model makes the DCL pattern thread safe but it makes it slower than the SingletonHolder class method while the original intent was performance optimization.

EDIT: Comme @Luno a souligné, since the second edition of the book, the preferred way is:

Avec la version 1.5, il existe une troisième approche de mise en œuvre singletons. Il suffit de faire un type ENUM avec un élément:

// Enum singleton - the preferred approach 
public enum Elvis { 
    INSTANCE; 

    public void leaveTheBuilding() { ... } 
} 

Cette approche est fonctionnellement équivalent à l'approche du domaine public, sauf qu'il est plus concis, fournit les mécanismes de sérialisation gratuitement et offre une garantie à toute épreuve contre l'instanciation multiple, même face à des attaques sophistiquées de sérialisation ou de réflexion. Bien que cette approche n'ait pas encore été largement adoptée, un type enum mono-élément est le meilleur moyen d'implémenter un singleton.

+7

En fait, Josh Bloch écrit que la meilleure façon d'implémenter singleton est utiliser enum. enum MySingletonClass { INSTANCE; } Parce que c'est l'enregistrement de thread, il ne fait aucun problème avec la sérialisation, sans risques de sécurité. –

+1

En effet, dans la deuxième édition de Effective Java, Joshua Bloch écrit que ** un type enum mono-élément est la meilleure façon d'implémenter un singleton ** (http://www.informit.com/articles/article.aspx? p = 1216151 et seqNum = 3). –

+0

@Luno & @Pacal: yep thx, j'ai googlé pour un extrait et édité la réponse pour l'exhaustivité –

2

Fondamentalement, en Java vous implémentez singleton en donnant une classe d'un constructeur sans args privé (private MyClass()), et statiquement (ou paresseusement) l'initialisation d'une seule instance de la classe qui est renvoyée par une méthode MyClass getInstance() statique.

Vous utiliseriez ceci si vous voulez qu'il n'y ait pas plus d'une instance de votre classe dans toute l'application.

0

« Simply Singleton » à JavaWorld

Et si vous voulez vraiment entrer dans les tranchées, commencer la lecture sur « statique vs singleton » sur le groups ou Google il. Toujours un sujet brûlant, c'est le moins qu'on puisse dire!

1

danben a un assez bon résumé de ce qu'est un singleton, donc je ne vais pas le ressasser. En ce qui concerne les utilisations, les singletons sont souvent des implémentations à peine voilées de variables globales (ce qui est une mauvaise idée).Ils peuvent être utiles pour des choses comme les routeurs de messages ou les classes de gestionnaires (entre autres choses).

0

Un endroit souvent sous-estimé où les singletons sont bons est quand vous voulez abstraire l'existence de l'état. Un exemple est un générateur de nombres aléatoires. Au niveau de l'abstraction, il génère simplement des nombres aléatoires et n'a aucun état dont l'appelant devrait se soucier. Au niveau de la mise en œuvre, cependant, l'état est impliqué. Un autre est quand une fonction met en cache des résultats ou des calculs intermédiaires, mais vous voulez cacher ce détail à l'appelant.

Il y a un compromis significatif ici. Si vous faites des choses comme ces singletons, vous diminuez la quantité de détails d'implémentation dont l'appelant de votre fonction doit se soucier, diminuant ainsi le couplage dans cette direction. Cependant, en même temps, vous associez fortement votre fonction à l'objet singleton, ce qui rend le test plus difficile, etc. La décision d'utiliser un singleton doit être prise en fonction de la direction dans laquelle vous voulez réduire le couplage.

0

suppose que vous avez une seule imprimante dans le bureau et vous avez besoin Assurez-vous d'une classe d'imprimante a une seule instance

printer{ 
private static printer instance =null; 
private printer(){} 
public static printer getinst(){ 
if(instance==null){ 
instant = new printer(); 

} 
return instance; 


} 


} 

dans la principale

printer v=printer.geti();