构造函数在创建记录器时未被调用java
问题描述:
我正在实现我的Logger类,但由于一个奇怪的原因构造函数方法从未被调用过。在其他课上,当我使用SRCLogger.getLogger().log(Level.INFO, "Message");
时,路径上没有创建日志文件。构造函数在创建记录器时未被调用java
我错过了什么?这段代码有什么问题?
这里是我的代码:
public final class SRCLogger implements Serializable{
private static final Logger l = Logger.getLogger("mySRCLogger");
private FileHandler fh;
private String ROOT_DIR = "C:\\Users\\Test\\Desktop\\";
public SRCLogger(){
System.out.println("Constructor.");
try {
fh = new FileHandler(ROOT_DIR + "SRCLog.log");
fh.setFormatter(new SimpleFormatter());
l.addHandler(fh);
System.out.println("Try.");
} catch (IOException ex) {
Logger.getLogger(SRCLogger.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Catch IOException.");
} catch (SecurityException ex) {
Logger.getLogger(SRCLogger.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Catch SecurityException.");
}
}
public static Logger getLogger(){
return l;
}
}
欢呼和预先感谢
答
很简单 - 你永远调用构造。你打电话的:
public static Logger getLogger(){
return l;
}
...返回l
,静态字段这样的初始化:
private static final Logger l = Logger.getLogger("mySRCLogger");
你为什么会认为触发你的类实例化?你没有任何实例方法的事实也是一种设计气味 - 除了向现有的记录器添加处理程序外,你还期望类能够完成什么?如果这就是你想要做的,我会改变你的类,只是有一个静态方法 - 你不需要任何实例,据我所知。
答
为了调用构造函数,必须使用“new”关键字实例化对象。如果仅调用类的静态方法(而不是对象),则不会调用构造函数。
所以
SRCLogger.getLogger()
是被称为静态方法。
如果你这样做
new SRCLogger().getLogger()
,然后构造函数将被调用,但它不是好的做法呼吁的对象实例的静态方法。静态方法应该在类本身上调用。
所以,如果我想记录器有处理程序,我应该把该处理程序的代码放在静态方法而不是构造函数? – BRabbit27 2012-03-21 17:38:22
@ BRabbit27:你不是在写一个*处理程序* - 你只是在创建一个'FileHandler'。将该处理程序添加到记录器的代码可以是静态方法,是的。 – 2012-03-21 17:41:02
你应该有一个静态方法'private static init()',它应该包含你在构造函数中执行的所有任务。如果已经调用了'init',则可以保留一个布尔标志。在'getLogger()'你应该检查该标志,如果它的'false'然后调用'init'否则不要 – 2012-03-21 17:49:55