我正在实现我的Logger类,但由于一个奇怪的原因,永远不会调用构造函数方法。在其他类中,当我使用SRCLogger.getLogger().log(Level.INFO, "Message");
时,路径上没有创建日志文件。
我错过了什么?这段代码有什么问题?
这是我的代码:
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;
}
}
提前干杯和谢谢
答案 0 :(得分:4)
很简单 - 你永远不会调用构造函数。你在说这个:
public static Logger getLogger(){
return l;
}
...返回l
,这是一个初始化的静态字段:
private static final Logger l = Logger.getLogger("mySRCLogger");
为什么你会期望触发你的类被实例化?你没有任何实例方法这一事实也是一种设计气味 - 除了在现有记录器中添加处理程序之外,你还期望该类完成什么?如果这就是你要做的全部,我会改变你的类只有一个静态方法 - 你根本不需要任何实例。
答案 1 :(得分:0)
为了调用构造函数,必须使用“new”关键字对象进行实例化。如果只调用类的静态方法(而不是对象),则不会调用构造函数。
所以
SRCLogger.getLogger()
是一个被调用的静态方法。
如果您执行类似
的操作 new SRCLogger().getLogger()
,然后将调用构造函数,但在对象实例上调用静态方法不是一个好习惯。静态方法应该在类本身上调用。