我正在尝试提高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)仅调用重载方法:
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它实际上不存在(您在静态上下文中运行)。
this.getClass()
this
根据我的经验,最好将ClassName.getClass()用作参数,除非您真的想使用来自不同类的相同记录器。在这种情况下,最好使用一些表示记录器的逻辑常数。
ClassName.getClass()
例如,假设您要尝试使用3个不同的类来访问数据库。因此,您创建了记录器’DB’,分配了一个文件附加程序,该文件附加器将写入database.log,并且您想在这3个不同的类之间重用同一记录器。
因此,您应该使用以下代码:
public class SomeClass { private static final Logger LOG = LoggerFactory.getLogger("DB"); }
希望这可以帮助