2011-03-11 57 views
8

我正在尋找一個類似於PHP Scope Resolution Operator的靜態上下文方式在JAVA中的當前類的「自我」引用?Java「自我」(靜態)引用

解決方案:打破範圍?當心,這是比較靜態的定義真的慢(通過因子300):

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

老式的方法是:

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

有什麼辦法?我正在尋找一種將記錄器定義放入抽象類的方法。記錄器應該確定它自己被調用的類。

回答

12

的速度稍快

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

如果你這樣做1000次將需要使用Class.class.getName()36毫秒和60毫秒做這種方式。也許它不值得擔心太多。 ;)

3

你不應該繼承記錄器。只需在每個班級申報記錄員。

但是,如果你不想做這樣有用想,只是不讓它靜態)

0

我不認爲有是顯著不同的兩個在你的問題的任何方案。

您可以創建一個輔助方法是這樣的:

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

然後

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

但那是因爲原來的版本貴。 (FWIW - 300倍的緩慢可能不是一個主要問題,除非你有成千上萬的這些記錄器,每一個靜態記錄只需要初始化一次...)

我個人的偏好是「老式」正在做。

相關問題