Haruskah logger dinyatakan statis atau tidak? Biasanya saya telah melihat dua jenis deklarasi untuk seorang logger:
dilindungi Log log = baru Log4JLogger (aClass.class);
atau
pribadi Log log statis = baru Log4JLogger (aClass.class);
Mana yang harus digunakan? apa pro dan kontra dari keduanya?
static
adalah satu referensi per kelas. non-statis adalah satu referensi per instance (+ inisialisasi). Jadi dalam beberapa kasus, yang terakhir datang pada dampak memori yang signifikan jika Anda memiliki banyak contoh. Jangan pernah menggunakan non-statis di objek yang sering . Saya selalu menggunakan versi statis. (yang harus diberi huruf besarLOG
)private static final Log log
huruf kecil. Logger bukanlah sebuah konstanta, logger adalah objek akhir statis (yang dapat dimutasi). Secara pribadi saya selalu menggunakanlogger
.Jawaban:
Keuntungan dari bentuk non-statis adalah Anda dapat mendeklarasikannya dalam kelas dasar (abstrak) seperti berikut tanpa khawatir bahwa nama kelas yang tepat akan digunakan:
Namun kerugiannya jelas bahwa instance logger baru akan dibuat untuk setiap instance kelas. Ini mungkin tidak mahal, tetapi menambah biaya tambahan yang signifikan. Jika Anda ingin menghindari ini, Anda ingin menggunakan
static
formulir sebagai gantinya. Tetapi kerugiannya adalah pada gilirannya Anda harus mendeklarasikannya di setiap kelas individu dan berhati-hati di setiap kelas bahwa nama kelas yang tepat telah digunakan selama konstruksi logger karenagetClass()
tidak dapat digunakan dalam konteks statis. Namun, di IDE rata-rata Anda dapat membuat template pelengkapan otomatis untuk ini. Misalnyalogger
+ctrl+space
.Di sisi lain, jika Anda mendapatkan logger oleh pabrik yang pada gilirannya dapat menyimpan logger yang sudah ada, maka menggunakan formulir non-statis tidak akan menambah banyak overhead. Log4j misalnya memiliki a
LogManager
untuk tujuan ini.sumber
abstract Log getLogger();
di kelas abstrak. Terapkan metode ini, mengembalikan logger statis untuk instance tertentu. Tambahkanprivate final static Log LOG = LogManager.getLogger(Clazz.class);
ke template kelas IDE Anda.protected Logger log = LoggerFactory.getLogger(getClass());
Saya dulu berpikir bahwa semua penebang harus statis; namun, artikel di wiki.apache.org ini mengangkat beberapa masalah memori penting, terkait kebocoran classloader. Mendeklarasikan logger sebagai statis mencegah kelas deklarasi (dan classloader terkait) dikumpulkan sampah di kontainer J2EE yang menggunakan classloader bersama. Ini akan menghasilkan kesalahan PermGen jika Anda menerapkan ulang aplikasi cukup sering.
Saya tidak benar-benar melihat cara untuk mengatasi masalah kebocoran classloader ini, selain menyatakan penebang sebagai non-statis.
sumber
Perbedaan terpenting adalah bagaimana pengaruhnya terhadap file log Anda: di kategori manakah log masuk?
Ada varian dari kasus pertama Anda:
dilindungi Log log = baru Log4JLogger (getClass ());
Dalam hal ini, kategori log Anda mengatakan objek mana yang sedang digunakan kode login.
Dalam pilihan kedua Anda (private statis), kategori log adalah kelas yang berisi kode logging. Jadi biasanya kelas yang melakukan hal yang sedang dicatat.
Saya sangat merekomendasikan opsi terakhir itu. Ini memiliki kelebihan berikut, dibandingkan dengan solusi lain:
Ini juga memiliki kekurangan:
sumber
Gunakan kontrol inversi dan berikan logger ke konstruktor. Jika Anda membuat logger di dalam kelas, Anda akan bersenang-senang dengan pengujian unit Anda. Anda sedang menulis tes unit bukan?
sumber