標籤:輸出 effect 為什麼 this 複雜 bsp eve isa int
項目中經常會用到:
if (logger.isDebugEnabled()) {
logger.debug( "message:" + user.getMessage() );
}
我們會想當然得認為這段代碼作用是為了控制記錄檔的輸出,但是通過查看源碼我們會發現,在debug()方法中做了與isDebugEnabled()方法一樣的判斷,因此我們在需要輸出日誌的地方直接調用debug方法也可以達到控制輸出的目的。
以下是isDebugEnabled()以及debug()方法的源碼:
public boolean isDebugEnabled() {
if(repository.isDisabled( Level.DEBUG_INT))
return false;
return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
}
public void debug(Object message) {
if(repository.isDisabled(Level.DEBUG_INT))
return;
if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
forcedLog(FQCN, Level.DEBUG, message, null);
}
}
那麼我們為什麼還要多此一舉,加上這樣一個判斷語句呢?
官方的說法是:出於效率考慮,看具體情況而定。
首先我們看以下代碼:
log.debug( "message:" + user.getMessage() );
假如我們的記錄層級為info,那麼這句話不會被輸出,但是這樣寫,這個方法還是會調用,因此getMessage()方法還是會執行。如果getMessage()這個方法過於複雜,需要很長時間來執行。而參數構造完之後,我們進入debug()方法進行判斷:
if(repository.isDisabled(Level.DEBUG_INT))
return;
在這裡就返回了。這樣會導致我們什麼都沒有做但卻耗費了時間,如果並發量大的時候,對效能的影響就比較明顯了。
這個時候,出於效能的考慮,我們就應當添加isDebugEnabled()判斷
if (logger.isDebugEnabled()) {
logger.debug( "message:" + user.getMessage() );
}
但是如果是這樣簡單的輸出:
logger.debug(“error”);
添加判斷就沒有必要了。
logger.isDebugEnabled()作用