2012-10-30 19 views
0

假設層次結構中的所有類都只有默認構造函數,那麼創建Log實例的問題如下所示?Log4j在基類中創建日誌實例

public abstract class AbstractService { 


    protected static Log log=null; 


    public AbstractService(){ 
     log=LogFactory.getLog(this.getClass().getName()); 
    } 

    public void foo(){  
     log.debug("base foo() : "); 
    } 

} 


class ServiceA extends AbstractService {  

    public void foo(){ 
     super.foo(); 

     log.debug("Overloaded foo() in ServiceA");  
    } 
} 


class ServiceB extends AbstractService { 
    public void foo(){ 
     super.foo(); 
     log.debug("Overloaded foo() in ServiceB");  

    } 
} 
+0

我認爲一個問題是代碼不會編譯? –

+0

我更新了,現在它編譯 –

回答

3

鑑於「日誌」字段是靜態的(即,與AbstractService類相關聯的),它不應該從構造(其與該類別的特定實例相關聯)來設置。

你要麼需要:

  • 使 「日誌」 領域中的非靜態,​​或
  • (你打算大概是什麼,因爲你正在使用的getClass將其命名爲()的getName())。在聲明中初始化它,例如受保護的靜態日誌日誌= LogFactory.getLog(AbstractClass.class);
+0

1.如果我使它非靜態,它會爲每個類創建新的實例? (或Log4j只引用與類名相關的相同的日誌實例)? –

+0

2.第二種方法,我只獲取AbstractClass的日誌記錄。但通過我的方法,日誌記錄顯示了子類的名稱。 –

+0

如果您希望記錄器顯示具體子類的名稱,則必須使記錄器非靜態,在這種情況下,任何此類的每個實例都將擁有自己的Log實例。 –