Andere haben das Problem mit Singletons im Allgemeinen sehr gut erklärt. Ich möchte nur einen Hinweis zum speziellen Fall von Logger hinzufügen. Ich stimme Ihnen zu, dass es normalerweise kein Problem ist, als Singleton über eine statische Methode getInstance()
oder eine getRootLogger()
Methode auf einen Logger (oder genauer gesagt auf den Root-Logger) zuzugreifen . (es sei denn, Sie möchten sehen, was von der Klasse, die Sie testen, protokolliert wird - aber meiner Erfahrung nach kann ich mich kaum an solche Fälle erinnern, in denen dies erforderlich war. Andererseits könnte dies für andere ein dringlicheres Problem sein).
IMO ist normalerweise ein Singleton-Logger kein Problem, da er keinen Status enthält, der für die zu testende Klasse relevant ist. Das heißt, der Status des Loggers (und seine möglichen Änderungen) haben keinerlei Auswirkungen auf den Status der getesteten Klasse. Dies erschwert Ihre Unit-Tests nicht.
Die Alternative wäre, den Logger über den Konstruktor in (fast) jede einzelne Klasse in Ihrer App zu injizieren. Aus Gründen der Konsistenz der Schnittstellen sollte es auch dann eingefügt werden, wenn die betreffende Klasse derzeit nichts protokolliert. Die Alternative wäre, dass Sie, wenn Sie irgendwann feststellen, dass Sie jetzt etwas aus dieser Klasse protokollieren müssen, einen Logger benötigen Sie müssen einen Konstruktorparameter für DI hinzufügen, der den gesamten Clientcode bricht. Ich mag diese beiden Optionen nicht und ich bin der Meinung, dass die Verwendung von DI für die Protokollierung mein Leben nur komplizieren würde, um einer theoretischen Regel ohne konkreten Nutzen zu entsprechen.
Mein Fazit lautet also: Eine Klasse, die (fast) universell verwendet wird, aber keinen für Ihre App relevanten Status enthält, kann sicher als Singleton implementiert werden .