113 votes

Pourquoi utiliser un singleton plutôt que des méthodes statiques ?

Je n'ai jamais trouvé de bonnes réponses à ces questions simples sur les classes d'aide/utilité :

  • Pourquoi créer un singleton (sans état) au lieu d'utiliser des méthodes statiques ?
  • Pourquoi une instance d'objet serait-elle nécessaire si un objet n'a pas d'état ?

0 votes

0 votes

Je ne pense pas, puisque nous parlons de deux langues différentes, la réponse peut varier, mais merci pour le lien, en java je n'ai jamais entendu le terme "monostate".

89voto

Heinzi Points 66519

Souvent, les singletons sont utilisés pour introduire une sorte de état global à une application. (Plus souvent que nécessaire, pour être honnête, mais c'est un sujet pour une autre fois).

Toutefois, il existe quelques cas particuliers où même une apatride singleton peut être utile :

  • Vous comptez l'étendre avec l'État dans un avenir proche.
  • Vous avez besoin d'un instance objet pour une certaine technique raison.
    Exemple : Objets de synchronisation pour le C# lock ou le Java synchronized déclaration.
  • Vous avez besoin de l'héritage, c'est-à-dire que vous voulez pouvoir remplacer facilement votre singleton par un autre utilisant la même interface mais une implémentation différente.
    Exemple : Le site Toolkit.getDefaultToolkit() en Java renvoie un singleton dont le type exact dépend du système.
  • Vous voulez égalité de référence pour un valeur sentinelle .
    Exemple : DBNull.Value en C#.

29 votes

Je vais aller avec +1, bien que IMHO singletons sont mal utilisé pour introduire des états globaux. Le but d'un singleton n'est pas de rendre un objet globalement disponible, mais de faire en sorte qu'un objet ne soit instancié qu'une seule fois. Les objets globaux sont un mal nécessaire. À moins d'en avoir vraiment besoin, on devrait essayer de ne pas les utiliser, car ils conduisent généralement à un couplage élevé, avec SomeSingleton.getInstance().someMethod() partout. :)

0 votes

Cela peut être utile dans les jeux où vous ne voulez qu'une seule instance de rendu au lieu de plusieurs, ou avec une classe de tuyauterie réseau où vous configurez un canal sécurisé pour qu'il n'y ait qu'une seule connexion à la fois.

2 votes

La partie "remplacer facilement votre singleton" est le point le plus important de mon point de vue. Rest est assez proche de l'implémentation d'une classe statique.

43voto

tzaman Points 13190

Je pourrais voir un cas d'utilisation d'un singleton apatride au lieu d'une classe de méthodes statiques, à savoir pour Injection de dépendances .

Si vous disposez d'une classe d'aide composée de fonctions utilitaires que vous utilisez directement, cela crée une dépendance cachée ; vous n'avez aucun contrôle sur qui peut l'utiliser, ni où. L'injection de cette même classe d'aide via une instance singleton sans état vous permet de contrôler où et comment elle est utilisée, et de la remplacer / la simuler / etc. lorsque vous en avez besoin.

Le fait d'en faire une instance singleton garantit simplement que vous n'allouez pas plus d'objets de ce type que nécessaire (puisque vous n'en avez jamais besoin que d'un seul).

1 votes

"vous n'avez aucun contrôle sur qui peut l'utiliser, ni où." Pourquoi quelqu'un en aurait-il besoin ?

1 votes

@hagrawal à des fins de test, vous devriez être en mesure de le simuler.

19voto

Sebastien Lorber Points 9682

En fait, j'ai trouvé une autre réponse non mentionnée ici : les méthodes statiques sont plus difficiles à tester.

Il semble que la plupart des frameworks de test fonctionnent très bien pour le mocking des méthodes d'instance mais beaucoup d'entre eux ne gèrent pas de manière décente le mocking des méthodes statiques.

2 votes

Mais Powermock semble être capable de le faire

7voto

back2dos Points 13253

Dans la plupart des langages de programmation, les classes échappent en grande partie au système de types. Bien qu'une classe, avec ses méthodes et ses variables statiques, soit un objet, elle ne peut très souvent pas implémenter une interface ou étendre d'autres classes. Pour cette raison, elle ne peut pas être utilisée de manière polymorphe, puisqu'elle ne peut pas être le sous-type d'un autre type. Par exemple, si vous avez une interface IFooable qui est requis par plusieurs signatures de méthodes d'autres classes, l'objet classe StaticFoo ne peut pas être utilisé à la place de IFooable alors que FooSingleton.getInstance() peut (en supposant, FooSingleton met en œuvre IFooable ).

Veuillez noter que, comme je l'ai commenté dans la réponse de Heinzi, un singleton est un modèle pour contrôler l'instanciation. Il remplace new Class() con Class.getInstance() qui donne à l'auteur de Class plus de contrôle sur les instances, qu'il peut utiliser pour empêcher la création d'instances inutiles. Le singleton n'est qu'un cas très particulier du factory pattern et doit être traité comme tel. Son utilisation courante en fait plutôt le cas particulier des registres globaux, ce qui finit souvent mal, car les registres globaux ne devraient pas être utilisés n'importe comment.

Si vous prévoyez de fournir des fonctions d'aide globales, les méthodes statiques feront parfaitement l'affaire. La classe n'agira pas comme une classe, mais plutôt comme un espace de nom. Je vous suggère de préserver une cohésion élevée, sinon vous risquez de vous retrouver avec des problèmes de couplage très étranges.

salutations
back2dos

2voto

Indigo Praveen Points 179

Le singleton n'est pas sans état, il détient l'état global.

Voici quelques raisons auxquelles je pense pour utiliser Singleton :

  • Pour éviter les fuites de mémoire
  • Pour fournir le même état à tous les modules d'une application, par exemple la connexion à la base de données.

0 votes

Je sais mais en fait un singleton peut plus ou moins être sans état... S'il ne partage aucun attribut de classe...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X