10
votes

Mise en œuvre du modèle singleton en Java

Quelqu'un peut-il offrir un exemple de motif singleton et expliquer pourquoi ils sont nécessaires?


1 commentaires

Pour accepter les réponses à vos questions, vous devez cliquer sur la coche qui apparaît en gris sous le score d'une réponse: ces marques deviendront vert ce qui signifie que vous l'avez accepté, voir Stackoverflow.com/faq


6 Réponses :


32
votes

Avant d'aller la route Singleton, reconsidère. Avez-vous vraiment besoin d'un singleton? Si vous demandez des scénarios lorsque vous devez implémenter des singletons, c'est parce que le besoin d'eux n'exprimait pas vraiment. Vous ferez mieux d'introduire des singletons dans votre base de code simplement parce que vous êtes cool de suivre des modèles de conception.

Nettoyer les discussions de code - Etat mondial et singletons

Une fois n'est pas suffisant

Singletons performants

Cependant, ce qui vaut vraiment la peine de savoir est Injection de dépendance .

MAINTENANT Si vous voulez vraiment mettre en œuvre des singletons à Java, je recommanderais à Joshua Bloch's " Java efficace " de la manière de les implémenter: xxx

" http: / "http: / /java.sun.com/docs/books/jls/third%5Fedition/html/execution.html#44557 "rel =" Norefer RER "> JLS garantit que la JVM n'initialisera pas l'instance jusqu'à ce que quelqu'un n'appelle getinstance ();

note finale, le Double motif de verrouillage vérifié est cassé en Java jusqu'à Java 5 . Le modèle de mémoire Java 5 rend le fil de modèle de DCL SAFE, mais cela le rend plus lent que le Singletonholder Méthode de classe Bien que l'intention d'origine était l'optimisation de la performance .

EDIT: Comme @Luno a signalé, Depuis la deuxième édition du livre, la manière préférée est la suivante:

À partir de la version 1.5, il existe une troisième approche pour mettre en œuvre des singletons. Faites simplement un type d'enum avec un élément: xxx

Cette approche est fonctionnellement équivalente à l'approche publique sur le terrain, sauf qu'il est plus concis, fournit gratuitement les machines de sérialisation et fournit une garantie Ironclad contre plusieurs instanciations, même face à la sérialisation sophistiquée ou aux attaques de réflexion sophistiquées. Bien que cette approche n'a pas encore été largement adoptée, Un type d'énumération unique est le meilleur moyen de mettre en œuvre un singleton.


6 commentaires

En fait, Josh Bloch écrit que le meilleur moyen d'implémenter Singleton est d'utiliser Enum. Enum mysingletonclass {instance; } Parce que c'est une sauvegarde de fil, cela ne pose aucun problème de sérialisation, aucun risque de sécurité.


En effet, dans la deuxième édition de Java efficace, Joshua Bloch écrit que Un type d'échec à un seul élément est le meilleur moyen de mettre en œuvre un singleton ( informit.com/articles/article.aspx?p=1216151&eqnum=3 ).


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


Re: Verrouillage vérifié double - Le modèle de mémoire JAVA 5 a une sémantique appropriée pour volatiles de telle sorte qu'il fait fonctionne dans les environnements de la version 5 et de l'exécution ultérieure, alors disant qu'il est cassé n'est pas cassé. plus précis. Cela dit, il y a souvent une meilleure façon de réaliser ses objectifs que d'utiliser DCL de toute façon ... :-)


@Andrzej thx pour le pointant sur cette sortie, j'ai édité la réponse avec une référence à IBM .Com / DeveloperWorks / Bibliothèque / J-JTP03304 / # 3.2


Quelques problèmes: (1) Heuvra dit essentiellement dans sa présentation sur l'injection de dépendance que «les États mondiaux sont mauvais» (mon interprétation). Mais comment explique-t-il des constantes nommées telles que math.pi et fonctions telles que math.sin (int) ? Comment utilise-t-on ces choses sans les états mondiaux? En outre, (2) concernant Bloch, en utilisant un énumé comme un singleton pourrait être bon pour la sérialisation, mais vous ne pouvez pas étendre une autre classe. Par exemple, disons que j'ai une classe wizard et une autre classe harrpotter étend l'assistant que je veux être un singleton? harrypotter ne peut pas être un énumé parce que Enums ne peut pas étendre les classes.



2
votes

Fondamentalement, dans Java, vous implémentez Singleton en donnant à une classe un constructeur privé de no-args privé ( MyClass privé () ), et statiquement (ou paresseusement) initialisation d'une seule instance de la classe qui est renvoyée. par un myClass getinstance () méthode.

Vous utiliseriez cela lorsque vous souhaitez qu'il n'y ait plus d'instance de votre classe sur toute l'application.


0 commentaires

0
votes

' Tout simplement singleton ' à Javaworld

Et si vous voulez vraiment entrer dans les tranchées, commencez à lire sur "statique vs singleton" sur le groupes ou Google. Toujours un sujet brûlant pour dire le moins!


0 commentaires

1
votes

Danben a un assez bon résumé de ce qu'est un singleton, donc je ne le ferai pas.

En ce qui concerne les utilisations, les singletons sont souvent des implémentations de variables globales (qui est une mauvaise idée). Ils peuvent être utiles pour des choses comme des routeurs de messages ou des classes de gestionnaire (entre autres).


0 commentaires

0
votes

Un lieu souvent sous-estimé où les singletons sont bons, c'est quand vous souhaitez abstraire l'existence de l'état. Un exemple est un générateur de nombres aléatoires. Au niveau de l'abstraction, cela génère simplement des nombres aléatoires et n'a pas d'état que l'appelant doit avoir besoin de se soucier. Au niveau de la mise en œuvre, cependant, l'état est impliqué. Une autre est lorsque une fonction met en cache des résultats ou des calculs intermédiaires, mais vous souhaitez masquer ce détail de l'appelant.

Il y a un compromis important ici. Si vous faites des choses comme ces singletons, vous réduisez la quantité de détails de la mise en œuvre que l'appelant de votre fonction doit se soucier, ainsi que la diminution du couplage dans cette direction. Cependant, en même temps, vous avez fortement couplez votre fonction à l'objet Singleton, ce qui rend plus difficile à tester, etc. La décision de savoir si un singleton doit être effectué sur la base de quelle direction vous vous souciez de réduire davantage l'accouplement.


0 commentaires

0
votes

Supposez que vous n'avez qu'une seule imprimante au bureau et vous devez vous assurer qu'une classe d'imprimante n'a qu'une instance xxx

dans la principale xxx


0 commentaires