2

我有这个父抽象类,它定义了一个 Apache 记录器静态对象。像这样的东西:

import org.apache.log4j.Logger;

public abstract class A {

    private final static Logger logger;

        (...)

}

我知道这段代码是非法的,因为记录器对象没有初始化。问题是我不想用 logger = Logger.getLogger(A.class); 初始化它 因为我希望每个子类都使用自己的类对象对其进行初始化,这样我就可以知道哪个类导致了哪个错误。

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

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

4

2 回答 2

2

使用创建它的实际类对其进行初始化:

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

为此,您需要从声明中删除static修饰符。logger我更喜欢保留它private并通过 getter 方法访问它,但您也可以制作它protected并直接从A子类访问。

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

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

于 2012-07-18T15:31:30.390 回答
0

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

您应该为每个子重新实例化它。

于 2012-07-18T15:31:34.777 回答