45 votes

Quelle est la différence entre un modèle Singleton et une classe statique en Java ?

En quoi un singleton est-il différent d'une classe remplie uniquement de champs statiques ?

43voto

StriplingWarrior Points 56276

Presque chaque fois que j'écris une classe statique, je finis par regretter de ne pas l'avoir implémentée comme une classe non statique. Pensez-y :

  • Une classe non statique peut être étendue. Le polymorphisme permet d'éviter de nombreuses répétitions.
  • Une classe non statique peut implémenter une interface, ce qui peut s'avérer pratique lorsque vous souhaitez séparer l'implémentation de l'API.

Grâce à ces deux points, les classes non statiques permettent, entre autres, d'écrire des tests unitaires plus fiables pour les éléments qui en dépendent.

Un modèle de singleton n'est cependant qu'à mi-chemin des classes statiques. Vous pouvez consulter en quelque sorte obtenir ces avantages, mais si vous y accédez directement dans d'autres classes via `ClassName.Instance', vous créez un obstacle à l'accès à ces avantages. Comme ph0enix l'a souligné, il vaut mieux utiliser un modèle d'injection de dépendance. De cette façon, un cadre DI peut être informé qu'une classe particulière est (ou n'est pas) un singleton. Vous bénéficiez de tous les avantages du mocking, des tests unitaires, du polymorphisme et de beaucoup plus de flexibilité.

18voto

instcode Points 978

Je vais résumer :)

La différence essentielle est : La forme d'existence d'un singleton est un objet, la statique ne l'est pas. Cela a conduit aux choses suivantes :

  • Le singleton peut être étendu. Statique non.
  • La création de singleton peut ne pas être threadsafe si elle n'est pas implémentée correctement. Non statique.
  • Le singleton peut être transmis comme un objet. Statique non.
  • Singleton peut être collecté par les ordures. Statique non.
  • Singleton est mieux que la classe statique !
  • Plus ici mais je n'ai pas encore réalisé :)

Enfin, chaque fois que vous allez implémenter un singleton, pensez à revoir votre idée pour ne pas utiliser cet objet Dieu (croyez-moi, vous aurez tendance à mettre toutes les choses "intéressantes" dans cette classe) et utilisez une classe normale appelée "Contexte" ou quelque chose comme ça à la place.

6voto

JRL Points 36674

Un singleton peut être initialisé paresseusement, par exemple.

3voto

Numenor Points 1462

La différence est indépendante de la langue. Singleton est par définition : " Assurer qu'une classe n'a qu'une seule instance et fournir un point d'accès global à celle-ci. "Une classe remplie uniquement de champs statiques n'est pas identique à un singleton mais peut-être que dans votre scénario d'utilisation, ils fournissent la même fonctionnalité. Mais comme JRL l'a dit l'initiation paresseuse est une différence.

2voto

Peter Tillemans Points 20129

Au moins, vous pouvez plus facilement le remplacer par un mock ou un stub pour les tests unitaires. Mais je ne suis pas un grand fan des singletons pour exactement la raison que vous décrivez : ce sont des variables globales déguisées.

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