一尘不染

LoggerFactory.getLogger(ClassName.class)与LoggerFactory.getLogger(this.getClass()。getName())

java

我正在尝试提高Java的优化技能。为了做到这一点,我有一个旧的程序,我正在尽力使它变得更好。在此程序中,我使用SL4J进行日志记录。要获取记录器,我需要执行以下操作:

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

在编写代码时,我认为这是最好的选择,因为我删除了对类名(可以重构)的引用。但是现在我不太确定了…

private static final Logger logger = LoggerFactory.getLogger(ClassName.class);

另一方面,保留对类名的引用,但它删除一个方法调用。对于一个班级来说,这可能并不是一个很大的进步,但是当您有很多班级时,这可能是一件好事。

所以我的问题是:

哪种方法更好?使用类名还是通过反射得到它?

请以利与弊来激发您的答案。谢谢。


阅读 812

收藏
2020-12-03

共1个答案

一尘不染

我会在这里分享我的意见。我要说的是,从性能的角度来看,您不应该为之烦恼。可能在代码中,有些部分可以比这件事优化得多:)

现在,关于您的问题。看一下LoggerFactory的代码

请注意,getLogger(Class<?> name)仅调用重载方法:

Logger logger = getLogger(clazz.getName());

并进行一些额外的计算。因此,使用String的方法显然要快一些。

通常,模式是将Logger引用维护为类中的静态字段,如下所示:

public class SomeClass {
   private static final Logger LOG =   LoggerFactory.getLogger(SomeClass.class);
}

在这种情况下,您不能真正使用它,this.getClass()因为this它实际上不存在(您在静态上下文中运行)。

根据我的经验,最好将ClassName.getClass()用作参数,除非您真的想使用来自不同类的相同记录器。在这种情况下,最好使用一些表示记录器的逻辑常数。

例如,假设您要尝试使用3个不同的类来访问数据库。因此,您创建了记录器’DB’,分配了一个文件附加程序,该文件附加器将写入database.log,并且您想在这3个不同的类之间重用同一记录器。

因此,您应该使用以下代码:

public class SomeClass {
   private static final Logger LOG =   LoggerFactory.getLogger("DB");
}

希望这可以帮助

2020-12-03