记录器是否应该被声明为静态的?通常我见过两种类型的记录器声明:
protected Log log = new Log4JLogger(aClass.class);
或
private static Log log = new Log4JLogger(aClass.class);
应该使用哪一个?两者的优缺点是什么?
最佳答案
非静态形式的优点是您可以在(抽象)基类中声明它,如下所示,而不必担心会使用正确的类名:
protected Log log = new Log4JLogger(getClass());
但是它的缺点显然是会为类的每个实例创建一个全新的记录器实例。这本身可能并不昂贵,但会增加大量开销。如果您想避免这种情况,您想改用 static
表单。但它的缺点是你必须在每个单独的类中声明它,并在每个类中注意在构造记录器期间使用正确的类名,因为 getClass()
不能在静态上下文中使用。但是,在一般的 IDE 中,您可以为此创建一个自动完成模板。例如。 logger
+ ctrl+空格
.
另一方面,如果您通过工厂获取记录器,而工厂又可能缓存已经实例化的记录器,那么使用非静态形式不会增加太多开销。例如,Log4j 有一个 LogManager
为此目的。
protected Log log = LogManager.getLogger(getClass());
关于java - 记录器是否应该是私有(private)静态的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842823/