Andere haben das Problem mit Singletons im Allgemeinen sehr gut erklärt. Ich möchte nur eine Notiz über den speziellen Fall von Logger hinzufügen. Ich stimme Ihnen zu, dass es in der Regel kein Problem ist, über eine statische getInstance()
oder getRootLogger()
Methode auf einen Logger (oder den Root Logger, um genau zu sein) als Singleton zuzugreifen. (es sei denn, Sie wollen sehen, was von der Klasse, die Sie testen, protokolliert wird - aber nach meiner Erfahrung kann ich mich kaum an solche Fälle erinnern, in denen dies notwendig war. Für andere wiederum könnte dies ein dringenderes Anliegen sein).
IMO normalerweise ein Singleton-Logger ist keine Sorge, da es keinen Zustand für die Klasse enthält, die Sie testen. Das heißt, der Zustand des Loggers (und seine möglichen Änderungen) haben keinerlei Auswirkung auf den Zustand der getesteten Klasse. Das macht deine Unit-Tests nicht schwieriger.
Die Alternative wäre, den Logger über den Konstruktor zu (fast) jeder einzelnen Klasse in Ihrer App zu injizieren. Für die Konsistenz der Schnittstellen sollte es injiziert werden, selbst wenn die fragliche Klasse derzeit nichts protokolliert - die Alternative wäre, dass Sie einen Logger benötigen, wenn Sie an einem Punkt feststellen, dass Sie jetzt benötigen, um etwas aus dieser Klasse zu protokollieren , daher müssen Sie einen Konstruktorparameter für DI hinzufügen, der den gesamten Clientcode unterbricht. Ich mag beide Optionen nicht, und ich denke, dass die Verwendung von DI für das Logging mein Leben nur verkomplizieren würde, um einer theoretischen Regel zu entsprechen, ohne irgendeinen konkreten Vorteil.
Also meine Quintessenz ist: eine Klasse, die (fast) universell verwendet wird, aber nicht Status relevant für Ihre App enthält, kann als Singleton sicher implementiert werden.
Ich bin neu zu diesem Design pattren, und ich würde gerne wissen, warum meinst du mit "Test", wenn Sie speziell in Tests sagen? Danke im Voraus. – AnixPasBesoin
Ich meine Unit/Integration Tests – Bozho