我有这个父抽象类,它定义了一个Apache logger静态对象。像这样:
import org.apache.log4j.Logger;
public abstract class A {
private final static Logger logger;
(...)
}
我知道此代码是非法的,因为记录器对象未初始化。问题是我不想用logger = Logger.getLogger(A.class)初始化它;因为我希望每个子类用它自己的类对象初始化它,这样我就会知道哪个类导致了哪些错误。
但与此同时,我想在基类A中包含一些日志记录方法。
最佳做法是什么?我应该用A.class初始化它,然后为每个子类重新实例化它吗?不知怎的,对我来说感觉不对。
答案 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初始化它,然后为每个重新实例化它 儿童对象?
您应该为每个孩子班级重新验证。