创建logger java时未调用构造函数

时间:2012-03-21 17:32:50

标签: java logging constructor

我正在实现我的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;
    }   
}

提前干杯和谢谢

2 个答案:

答案 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()

,然后将调用构造函数,但在对象实例上调用静态方法不是一个好习惯。静态方法应该在类本身上调用。