3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
在這種情況下,選項(xiàng)1更好。
isDebugEnabled()當(dāng)它涉及調(diào)用toString()各種對(duì)象的方法并連接結(jié)果時(shí),可以使用保護(hù)語句(檢查)來防止對(duì)日志消息進(jìn)行潛在的昂貴計(jì)算。
在給定的示例中,日志消息是一個(gè)常量字符串,因此讓記錄器丟棄它與檢查是否啟用記錄器一樣有效,并且由于分支較少,因此降低了代碼的復(fù)雜性。
更好的方法是使用最新的日志記錄框架,在該框架中,日志語句采用格式規(guī)范和由記錄器替換的參數(shù)列表,但只有在啟用記錄器后才“懶惰”。這是slf4j采取的方法。
有關(guān)更多信息,請(qǐng)參見我對(duì)相關(guān)問題的答案,以及使用log4j進(jìn)行此類操作的示例。

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
由于在選項(xiàng)1中消息字符串是一個(gè)常量,因此用條件包裝換行記錄語句絕對(duì)沒有收益,相反,如果啟用了調(diào)試語句,則將進(jìn)行兩次評(píng)估,一次在isDebugEnabled()
方法中,一次在系統(tǒng)中。debug()
方法。調(diào)用的成本isDebugEnabled()
約為5到30納秒,對(duì)于大多數(shù)實(shí)際目的而言應(yīng)該可以忽略不計(jì)。因此,選項(xiàng)2是不理想的,因?yàn)樗鼤?huì)污染您的代碼,并且不會(huì)帶來其他收益。

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
isDebugEnabled()通過串聯(lián)字符串來構(gòu)建日志消息時(shí),保留使用:
Var myVar = new MyVar();
log.debug("My var is " + myVar + ", value:" + myVar.someCall());
但是,在您的示例中,您僅記錄一個(gè)String而不執(zhí)行諸如串聯(lián)之類的操作就不會(huì)提高速度。因此,您只是在代碼中添加了膨脹,使其難以閱讀。
我親自在String類中使用Java 1.5格式調(diào)用,如下所示:
Var myVar = new MyVar();
log.debug(String.format("My var is '%s', value: '%s'", myVar, myVar.someCall()));
我懷疑是否有很多優(yōu)化,但是更容易閱讀。
請(qǐng)注意,盡管大多數(shù)日志記錄API都提供了開箱即用的格式:例如slf4j提供了以下內(nèi)容:
logger.debug("My var is {}", myVar);
甚至更容易閱讀。
添加回答
舉報(bào)