子类的静态类依赖对象初始化

时间:2012-07-18 15:28:04

标签: java inheritance static

我有这个父抽象类,它定义了一个Apache logger静态对象。像这样:

import org.apache.log4j.Logger;

public abstract class A {

    private final static Logger logger;

        (...)

}

我知道此代码是非法的,因为记录器对象未初始化。问题是我不想用logger = Logger.getLogger(A.class)初始化它;因为我希望每个子类用它自己的类对象初始化它,这样我就会知道哪个类导致了哪些错误。

但与此同时,我想在基类A中包含一些日志记录方法。

最佳做法是什么?我应该用A.class初始化它,然后为每个子类重新实例化它吗?不知怎的,对我来说感觉不对。

2 个答案:

答案 0 :(得分:2)

使用在其中创建的实际类初始化它:

logger = Logger.getLogger(getClass()); //log4j way of creating loggers

要执行此操作,您需要从static声明中删除logger修饰符。 我希望保留private并通过getter方法访问它,但您也可以将其设为protected并直接从A子类访问。

您不必担心会创建许多记录器对象,每个类实例一个记录器:引擎盖Logger包含记录器映射,每次创建新记录器时 - 它都被缓存。当你第二次尝试为同一个类获取记录器时 - 它只是从内部地图中检索出来。

因此,如果您的层次结构中有5个类,则无论您调用Logger多少次,都只会创建5个getLogger(getClass())个对象。

答案 1 :(得分:0)

  

我应该用A.class初始化它,然后为每个重新实例化它   儿童对象?

您应该为每个孩子班级重新验证。