Yang lain telah menjelaskan dengan sangat baik masalah dengan lajang secara umum. Saya hanya ingin menambahkan catatan tentang kasus spesifik Logger. Saya setuju dengan Anda bahwa biasanya bukan masalah untuk mengakses Logger (atau root logger, tepatnya) sebagai seorang tunggal, melalui statik getInstance()
atau getRootLogger()
metode. (kecuali jika Anda ingin melihat apa yang dicatat oleh kelas yang Anda uji - tetapi dalam pengalaman saya, saya hampir tidak dapat mengingat kasus seperti itu di mana hal ini diperlukan. Kemudian lagi, bagi orang lain ini mungkin menjadi masalah yang lebih mendesak).
Biasanya IMO logger tunggal tidak perlu dikhawatirkan, karena tidak berisi status apa pun yang relevan dengan kelas yang Anda uji. Artinya, status logger (dan kemungkinan perubahannya) tidak berpengaruh apa pun pada status kelas yang diuji. Jadi itu tidak membuat pengujian unit Anda lebih sulit.
Alternatifnya adalah memasukkan logger melalui konstruktor, ke (hampir) setiap kelas dalam aplikasi Anda. Untuk konsistensi antarmuka, itu harus dimasukkan bahkan jika kelas yang dimaksud tidak mencatat apa pun saat ini - alternatifnya adalah ketika Anda menemukan di beberapa titik bahwa sekarang Anda perlu mencatat sesuatu dari kelas ini, Anda memerlukan pencatat, jadi Anda perlu menambahkan parameter konstruktor untuk DI, melanggar semua kode klien. Saya tidak menyukai kedua opsi ini, dan saya merasa bahwa menggunakan DI untuk logging hanya akan mempersulit hidup saya untuk mematuhi aturan teoretis, tanpa manfaat konkret.
Jadi intinya adalah: kelas yang digunakan (hampir) secara universal, tetapi tidak berisi status yang relevan dengan aplikasi Anda, dapat dengan aman diimplementasikan sebagai Singleton .