D'autres ont très bien expliqué le problème des singletons en général. Je voudrais juste ajouter une remarque sur le cas spécifique du Logger. Je suis d'accord avec vous pour dire que ce n'est généralement pas un problème d'accéder à un Logger (ou au Root logger, pour être précis) en tant que singleton, via un static getInstance()
ou getRootLogger()
méthode. (sauf si vous voulez voir ce qui est enregistré par la classe que vous testez - mais dans mon expérience, je ne me souviens guère de cas où cela a été nécessaire. Cependant, pour d'autres personnes, cela pourrait être une préoccupation plus pressante).
En général, un logger singleton n'est pas un problème, puisqu'il ne contient pas d'état pertinent pour la classe que vous testez. En d'autres termes, l'état du logger (et ses éventuelles modifications) n'a aucun effet sur l'état de la classe testée. Il ne rend donc pas vos tests unitaires plus difficiles.
L'alternative serait d'injecter le logger via le constructeur, dans (presque) toutes les classes de votre application. Pour des raisons de cohérence des interfaces, le logger doit être injecté même si la classe en question n'enregistre rien pour l'instant. maintenant si vous avez besoin de journaliser quelque chose à partir de cette classe, vous avez besoin d'un logger, donc vous devez ajouter un paramètre de constructeur pour DI, ce qui casse tout le code client. Je n'aime pas ces deux options, et j'ai le sentiment qu'utiliser DI pour la journalisation ne ferait que me compliquer la vie afin de me conformer à une règle théorique, sans aucun avantage concret.
Donc ma conclusion est : une classe qui est utilisée (presque) universellement, mais qui ne contient pas d'état pertinent pour votre application, peut être implémentée en toute sécurité en tant que Singleton. .