我看的是logback的源碼
如果在日志等級符合輸出條件的情況下,兩個是沒有什么大區別的。
但如果是在日志等級不符合輸出條件的情況下:
由於字符串拼接是作為一個方法參數的,意味着它進入logback的內部判斷的時候,就已經是拼接成功了。而在這一步的拼接成功,涉及到String是一個final變量的問題,這個拼接是耗時了,創建了String,但是進入判斷之后又完全沒什么用。
這兩種是有區別的:
log.info("a" + "b"); // 沒有影響,因為在編譯時已經是常量了,一共1個變量
log.info(a + "b"); // 有影響,a變量是1個,常量"b"是一個,拼接后的有事一個,一共三個變量。
而如果是占位符的話,它直接在logback的內部判斷了日志等級是否足以輸出,不行就直接return了。
再有就是
isDebugEnabled()
這種方法如果要封裝,但是參數是需要邏輯處理的話,是沒有什么用處的,需要顯示聲明才行。
public void aa() { // ① cc("cc"); // ② if (log.isDebugEnabled()) { cc("cc"); } // ③ cc(bb()); // ④ if (log.isDebugEnabled()) { cc(bb()); } } public String bb() { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < 1000; i++) { stringBuilder.append(i); } return String.valueOf(stringBuilder); } public void cc(String aa) { if (log.isDebugEnabled()) { log.debug(aa); } }
①和②,是沒有什么區別的,但是③和④就用區別了。
④不會進行StringBuilder的拼接,但是③會。
