Question

Si une classe implémente un singleton, toutes les variables devraient-elles être déclarées statiques?

Y a-t-il une raison pour laquelle ils ne devraient pas être déclarés statiques? Est-ce que cela fait une différence?

Était-ce utile?

La solution

Non. Le motif Singleton signifie simplement qu'une seule instance est la seule instance - cela ne signifie pas "rendre tout statistiquement accessible".

Le modèle singleton vous donne tous les avantages d'une "instance unique", sans sacrifier la capacité de tester et de refactor votre code.

Éditer:

Le point que j'essaie de souligner est qu'il existe une différence entre la façon dont la fonctionnalité doit être consommée (qui dépend du contexte) et de la façon dont la fonctionnalité doit être initialisée.

Il peut être approprié que, dans la plupart des cas, votre objet n'aura qu'une seule instance (par exemple, dans votre système de production final). Mais il y a aussi d'autres contextes (comme les tests) qui sont rendus beaucoup plus difficiles si vous le forcez à être le seul choix.

De plus, faire quelque chose de statique a des implications plus importantes que «une seule instance de ma classe devrait être accessible» - ce qui est généralement l'intention.

De plus, dans les logiciels sur lesquels j'ai travaillé, l'initialisation et le cycle de vie des objets sont souvent contrôlés par quelqu'un d'autre (je parle de DI ici) - et rendre quelque chose de statique n'aide vraiment pas ici.

Autres conseils

Dans un modèle singleton commun, vous faites ne pas Utilisez des statistiques. Vous codez la classe pour utiliser des champs ordinaires, vous initialisez dans le constructeur, puis vous organisez pour exécuter de nouveaux MyClass() Une fois, stocker les résultats dans un endroit statique.

Non, la seule chose qui est généralement statique est la référence au singleton lui-même (et il existe également d'autres moyens de stocker cette référence, comme JNDI ou des conteneurs d'injection de dépendance).

La raison de ne pas déclarer les champs comme statiques (même si dans un singleton, vous n'aurez besoin que d'une seule instance) est que cela vous donne la flexibilité pour créer une autre instance légèrement différente de la classe normalement singleton. Vous voudrez peut-être le faire dans des situations spéciales, comme pour les tests.

Même si vous n'avez pas (pensez-vous) que vous avez besoin de cette flexibilité, il n'y a aucune raison de l'abandonner. Déclarer un champ comme statique n'a aucun avantage que vous perdriez.

Tu boîte Faites cela (pas nécessairement devrait). Mais, même pour un singleton, j'ai tendance à faire toutes les variables au niveau de l'objet plutôt qu'au niveau de la classe parce que:

  • Je peux à un moment donné décider qu'un singleton était une mauvaise idée pour cette classe et avoir des variables au niveau de la classe rendra plus difficile la refactorisation.
  • Avec les variables au niveau de l'objet, elles ne sont en train de naître que lorsque vous instanciez le singleton. Avec le niveau de classe, ils sont toujours là.

Conclusion: je n'ai jamais pu penser à un inconvénient pour les avoir comme un niveau d'objet, c'est ainsi que je le fais. Les deux inconvénients ci-dessus au niveau des classes peuvent être minuscules mais ils sont là. Cela revient probablement à la préférence personnelle à la fin.

Vous pouvez lire comment (une façon possible) pour créer un singleton en Java ici:

Modèles de conception WikiBooks: Java Singleton

Fondamentalement, vous n'avez pas besoin (ni ne devrait) rendre toutes choses dans la classe statique simplement parce que vous avez l'intention d'utiliser quelque chose comme singleton. Il existe plusieurs raisons

  • Vérifiez les réponses de Paxdiablo et Thilo
  • N'oubliez pas non plus que tout statique n'en fait pas un singleton dont vous auriez également besoin pour supprimer chaque constructeur (et rendre le constructeur par défaut privé)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top