En quoi un singleton est-il différent d'une classe remplie uniquement de champs statiques ?
Réponses
Trop de publicités?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é.
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.
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.