当前位置: 首页 > 面试题库 >

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

慕河
2023-03-14
问题内容

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

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

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

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

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

所以我的问题是:

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

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


问题答案:

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

现在,关于您的问题。看一下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");
}

希望这可以帮助



 类似资料:
  • 问题内容: 我在Eclipse Helios中创建了一个带有单个子模块的最小Maven项目。 在文件夹中,我放置了一个文件 java中,我创建了一个包含单个类的包,该类执行以下操作: 但是当我将代码作为junit 4单元测试运行时,我只是得到了NullPointerException。以前,这已经工作了一百万次了。有任何想法吗? 我遵循了此指南: 但仍然出现相同的错误。 问题答案: 使用时 get

  • 问题内容: 我想了解Class.forName(“ ClassName”)和ClassObject.getClass是否都返回该类的运行时实例。然后为什么在比较从这两个对象获得的结果Class对象时获取一个布尔值false(如果我们使用==或equals进行比较)。 我也想知道在类名上调用.class方法的确切用途。我读到它是在编译时等确定的,但目的是什么。Class.forName(“ Clas

  • 问题内容: 这个问题已经在这里有了答案 : 私人成员的Java反射getFields | 动态访问对象名称值 (2个答案) 7年前关闭。 我正在尝试获取特定类中的字段数。但是我使用的技术无法正常工作,并且始终返回0: 如何获得特定类别的字段计数? 问题答案: 用法 该方法适用于可访问的公共字段- 请参阅文档。

  • 我通过在public static void main()方法中实现接口I创建了匿名类。因此,Java8对于抽象方法test()的实现是从C类的imple()方法中提供的。 因此,在public static void main()方法printing_interface.getclass(),我得到了 但最终它打印的是package_path.C(告诉我C是类名)。这怎么可能?不应该再次打印pa

  • 在C语言中,假设每个算法被赋予完全相同的一组进程,那么先到先得、最短作业优先和循环之间的周转时间是否相等?还是调度算法不同?

  • 问题内容: 这两个似乎在做相同的事情。谁能解释两者的主要区别?您何时会使用一个与另一个? HttpServletRequest.getRemoteUser() HttpServletRequest.getUserPrincipal()。getName() 问题答案: A 代表可能会对您的应用程序进行身份验证的人。主体的 名称 取决于所使用的身份验证方法: 用户名,例如“ fred”(对于HTTP