我们经常可以看到,在使用日志框架时,会有如下写法:
1 | if (logger.isTraceEnabled()) { |
为什么要这样写呢?这样写有什么好处?
首先我们来看下这两个方法的源码:
1 | public boolean isTraceEnabled() { |
1 | public void trace(Object message) { |
我们可以看到,在使用trace方法打印日志时,会有与isTraceEnabled方法中一样的方法调用,也就是说等同于在trace中调用了isTraceEnabled方法。
那么为什么我们在使用时还要在外层进行一次判断呢?
官方的说法是:出于效率考虑,看具体情况而定。
我们就以下两种情况进行分析:
- 直接传入参数,无其他处理对于这种情况,则完全没有必要在外层进行筛选判断。
1
logger.trace("trace");
- 传参数时引入了其他方法对于这种情况,则需要考虑考虑了。如果getTotal()方法是一个较为复杂的、计算量庞大的方法,则在外层进行一下判断就是很有必要的了。无论当前系统的日志级别为哪一等级,程序程序都会调用debug方法,会执行getTotal方法,只不过最后的结果可能是不打印日志而已(日志级别为info或更高)。debug中调用这个方法会消耗较大资源,得不偿失。
1
logger.debug("The money is " + getTotal());