创建java记录器时未调用构造函数
我正在实现我的Logger类,但由于一个奇怪的原因,构造函数方法从未被调用。在另一个类中,当我使用创建java记录器时未调用构造函数,java,logging,constructor,Java,Logging,Constructor,我正在实现我的Logger类,但由于一个奇怪的原因,构造函数方法从未被调用。在另一个类中,当我使用SRCLogger.getLogger().log(Level.INFO,“Message”)路径上没有创建日志文件 我错过了什么?这个代码有什么问题 这是我的密码: public final class SRCLogger implements Serializable{ private static final Logger l = Logger.getLogger("mySRCLog
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;
}
}
干杯并提前表示感谢非常简单-您永远不会给构造函数打电话。你称之为:
public static Logger getLogger(){
return l;
}
。。。返回l
,一个初始化如下的静态字段:
private static final Logger l = Logger.getLogger("mySRCLogger");
为什么您希望它触发您的类被实例化?您没有任何实例方法这一事实也是一种设计味道——除了向现有记录器添加处理程序之外,您希望该类完成什么?如果这就是您想要做的,我会将您的类更改为只有一个静态方法-据我所知,您实际上不需要任何实例。非常简单-您永远不会调用构造函数。你称之为:
public static Logger getLogger(){
return l;
}
。。。返回l
,一个初始化如下的静态字段:
private static final Logger l = Logger.getLogger("mySRCLogger");
为什么您希望它触发您的类被实例化?您没有任何实例方法这一事实也是一种设计味道——除了向现有记录器添加处理程序之外,您希望该类完成什么?如果这就是您想要做的,我会将您的类更改为只有一个静态方法-据我所知,您实际上不需要任何实例。为了调用构造函数,必须使用“new”关键字实例化对象。如果只调用类(而不是对象)的静态方法,则不会调用构造函数
所以
是正在调用的静态方法
如果你这样做
new SRCLogger().getLogger()
,则将调用构造函数,但在对象实例上调用静态方法不是一种好的做法。应该对类本身调用静态方法 为了调用构造函数,必须使用“new”关键字实例化对象。如果只调用类(而不是对象)的静态方法,则不会调用构造函数
所以
是正在调用的静态方法
如果你这样做
new SRCLogger().getLogger()
,则将调用构造函数,但在对象实例上调用静态方法不是一种好的做法。应该对类本身调用静态方法 因此,如果我想让记录器拥有处理程序,我应该将该处理程序的代码放在静态方法中,而不是构造函数中吗?@BRabbit27:你不是在编写处理程序,你只是在创建一个FileHandler
。将该处理程序添加到记录器的代码可以在静态方法中,是的。您应该有一个静态方法private static init()
,它应该包含您在构造函数中执行的所有任务。如果已调用或未调用init
,则可以保留布尔标志。在getLogger()
中,您应该检查该标志,如果其false
,则调用init
,否则,如果我希望记录器具有处理程序,那么我应该将该处理程序的代码放在静态方法而不是构造函数中吗?@BRabbit27:您不是在编写处理程序-您只是在创建一个FileHandler
。将该处理程序添加到记录器的代码可以在静态方法中,是的。您应该有一个静态方法private static init()
,它应该包含您在构造函数中执行的所有任务。如果已调用或未调用init
,则可以保留布尔标志。在getLogger()
中,您应该检查该标志,如果其false
则调用init
,否则不要