2011-03-11 38 views
8

JAVA'daki geçerli sınıfa PHP Scope Resolution Operator gibi statik bir bağlamda "self" referans mı arıyorsunuz?Java "self" (statik) referans

Çözüm: Kapsam dışı mı?

static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName()); 

eski moda bir yol olacağını:

static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName()); 

Alternatifler var mı, bu gerçekten yavaş (faktör 300 ile) statik tanımı karşılaştırılır ÇEKİNMEK? Logger tanımını soyut bir sınıfa yerleştirmenin bir yolunu arıyorum. Kaydedici, kendisi tarafından çağrıldığı sınıfı belirlemelidir.

cevap

12

biraz daha hızlı

static final Logger LOG = LoggerFactory.getLogger(
     Thread.currentThread().getStackTrace()[0].getClassName()); 

Bunu 1000 kez yaparsanız kameranın bu şekilde yapıyor Class.class.getName kullanılarak 36 ms() ve 60 ms sürer. Belki de çok fazla endişelenmeye değmez. ;)

3

Kaydediciyi devralmamalısınız. Her sınıfta sadece logger bildirmek. Böyle yararlı düşünmek yapmak istemiyorsanız

Ama sadece

0

Ben sorunuzu iki önemli ölçüde farklı herhangi alternatifler vardır sanmıyorum) statik yapmazlar.

Bir yardımcı böyle yöntemi oluşturabilirsiniz:

public static String getCallingClassname() { 
    return new RuntimeException().getStackTrace()[1].getClassName(); 
} 

ve sonra

static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname()); 

ama bu orijinal sürümüne kadar pahalı. (FWIW - yavaş yavaş 300 kez büyük bir endişe, muhtemelen bu kaydediciler binlerce olmadıkça. Bu istatistiklerin her biri sadece bir kez başlatılır ...)

Benim kişisel tercihim "eski moda" yolu Bunu yapıyor.

İlgili konular