在繼承時聲明slf4j實例的一個注意點

引言

java中的log組件有,log4j, commons-logging, slf4j等, 在聲明的時候, 常見getClass()或者類名.class來做爲名稱, 這兩種方法各有特色,整體來講getClass()方便一些, 不過本人今天在繼承中遇到了點微妙的差別, 在這裏給你們分享下.java

代碼

log4j代碼:

<!-- lang: java --> 
log4j.rootLogger=info,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

父類代碼:

<!-- lang: shell -->
public class CreatorBase{

//方案一
// final private Logger logger = LoggerFactory.getLogger(getClass());

    //方案二 
// final private Logger logger = LoggerFactory.getLogger(CreatorBase.class);

    @Before
    public void setUp() throws Exception {
        //配置log4j
        logger.info("CreatorBase");
    }
}

子類代碼:

<!-- lang: java -->
public class WorkerCreator extends CreatorBase{

    final private Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    public void testCreateDB(){
        logger.info("Creating tables...");
    }
}

執行子類後的結果

本例採用log4j做爲slf4j的實現類
方案一:
[WorkerCreator]-[INFO] CreatorBase
[WorkerCreator]-[INFO] Creating tables...
方案二:
[CreatorBase]-[INFO] CreatorBase
[WorkerCreator]-[INFO] Creating tables...shell

###問題總結### 在方案一中, 使用了getClass(), 被繼承後, 在父類中卻打印了子類的類名. 而方案二中使用類名.class,能夠正確顯示類名. 在本案例中是這個狀況.
getClass()的好處是在ctrl+c, ctrl+v的時候很方便,不用改代碼.
在方案二中的類名.class的方式, 每次ctrl+c, ctrl+v都須要修改類名.class, 容易遺忘搞錯, 不過好處是在被繼承的時候,防止出錯.
結合實際狀況, 來選擇適合的寫法.apache

相關文章
相關標籤/搜索