他の人は、一般的なシングルトンの問題を非常によく説明しています。Loggerの特定のケースについてのメモを追加したいと思います。静的getInstance()
またはgetRootLogger()
メソッドを介して、シングルトンとしてロガー(正確にはルートロガー)にアクセスすることは通常問題ではないことに同意します。(テストしているクラスによって何がログに記録されるかを確認したい場合を除きますが、私の経験では、これが必要だったケースを思い出すことはほとんどできません。また、他の人にとっては、これはより差し迫った懸念事項かもしれません)。
IMOには通常、テストしているクラスに関連する状態が含まれていないため、シングルトンロガーは心配ありません。つまり、ロガーの状態(およびその可能な変更)は、テストされたクラスの状態にはまったく影響しません。したがって、ユニットテストがこれ以上難しくなることはありません。
別の方法は、コンストラクターを介して、アプリ内の(ほぼ)すべてのクラスにロガーを挿入することです。代わりにあなたがいることをいくつかの点で発見したときにということでしょう-インタフェースの一貫性を保つため、問題のクラスは、現時点では何もログインしていない場合でも、注入されるべきで、今ので、あなたがこのクラスから何かをログに記録する必要がある、あなたはロガーを必要としますDIのコンストラクターパラメーターを追加して、すべてのクライアントコードを壊す必要があります。私はこれらのオプションの両方が嫌いであり、ロギングにDIを使用することは、具体的なメリットなしに、理論的なルールに準拠するために私の人生を複雑にするだけだと感じています。
つまり、私の結論は次のとおりです。(ほぼ)普遍的に使用されているが、アプリに関連する状態を含まないクラスは、シングルトンとして安全に実装できます。