构造函数在创建记录器时未被调用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"); 

你为什么会认为触发你的类实例化?你没有任何实例方法的事实也是一种设计气味 - 除了向现有的记录器添加处理程序外,你还期望类能够完成什么?如果这就是你想要做的,我会改变你的类,只是有一个静态方法 - 你不需要任何实例,据我所知。

+0

所以,如果我想记录器有处理程序,我应该把该处理程序的代码放在静态方法而不是构造函数? – BRabbit27 2012-03-21 17:38:22

+0

@ BRabbit27:你不是在写一个*处理程序* - 你只是在创建一个'FileHandler'。将该处理程序添加到记录器的代码可以是静态方法,是的。 – 2012-03-21 17:41:02

+0

你应该有一个静态方法'private static init()',它应该包含你在构造函数中执行的所有任务。如果已经调用了'init',则可以保留一个布尔标志。在'getLogger()'你应该检查该标志,如果它的'false'然后调用'init'否则不要 – 2012-03-21 17:49:55

为了调用构造函数,必须使用“new”关键字实例化对象。如果仅调用类的静态方法(而不是对象),则不会调用构造函数。

所以

SRCLogger.getLogger() 

是被称为静态方法。

如果你这样做

new SRCLogger().getLogger() 

,然后构造函数将被调用,但它不是好的做法呼吁的对象实例的静态方法。静态方法应该在类本身上调用。