【发布时间】:2010-01-27 23:33:25
【问题描述】:
现在我正在做这样的事情:
private static Logger logger = LoggerFactory
.getLogger(MasterController.class);
有没有比使用类名(即 MasterController)更好的方法?也许是通用的?
【问题讨论】:
现在我正在做这样的事情:
private static Logger logger = LoggerFactory
.getLogger(MasterController.class);
有没有比使用类名(即 MasterController)更好的方法?也许是通用的?
【问题讨论】:
这个怎么样:
private final Logger logger = LoggerFactory.getLogger(getClass());
这种方法避免了复制+粘贴错误。
我读过(不记得几年前在哪里了)Logger 实例非常便宜,而且你的类的每个实例是否都有自己的记录器也没关系。
但是,如果您没有被说服,并且您希望 Logger 实例保持静态,那么它可能应该是 final 和大写,如下所示:
private static final Logger LOG = LoggerFactory.getLogger(MasterController.class);
【讨论】:
Logger instance(由 LoggerFactory 第一次调用它时创建每个类,并在以后使用同一类的调用中重用)。您实际上只是在使用它的类的每个实例中添加Logger reference 而不是单个静态引用。因此,您正在增加每个实例的大小(非常轻微),但不使用任何额外的内存来创建 Logger 实例。
final 某些代码,某些地方可能会重置记录器,甚至将其设置为null,然后所有记录器调用都会失败。这是 final 的一个非常有用的方面 - 防止简单的编程错误。
以下链接有一个有趣的方法:
http://www.rgagnon.com/javadetails/java-0402.html
为了方便,贴在这里:
public class ClassFromStatic {
public static void main(java.lang.String[] args) {
someStaticMethod();
}
public static void someStaticMethod() {
System.out.println
("I'm in " + new CurrentClassGetter().getClassName() + " class");
}
public static class CurrentClassGetter extends SecurityManager {
public String getClassName() {
return getClassContext()[1].getName();
}
}
}
【讨论】:
不确定您需要什么,但您可以随时致电getClass() on an Object
【讨论】: