我有这个父抽象类,它定义了一个 Apache 记录器静态对象。像这样的事情:
import org.apache.log4j.Logger;
public abstract class A {
private final static Logger logger;
(...)
}
我知道这段代码是非法的,因为记录器对象未初始化。问题是我不想用 logger = Logger.getLogger(A.class); 初始化它因为我希望每个子类都用自己的类对象初始化它,这样我就知道哪个类导致了哪些错误。
但同时我想在基类 A 上包含一些日志记录方法。
对此的最佳实践是什么?我应该用 A.class 初始化它,然后为每个子类重新实例化它吗?不知怎的,这对我来说是不正确的。
最佳答案
使用它在其中创建的实际类来初始化它:
logger = Logger.getLogger(getClass()); //log4j way of creating loggers
为此,您需要从 logger
声明中删除 static
修饰符。
我更喜欢将其保持私有(private)
并通过getter方法访问它,但您也可以将其设置为 protected
并直接从A
子类访问。
您不必担心会创建许多记录器对象,每个类实例一个记录器:在底层 Logger
包含记录器映射,每次创建新记录器时 - 它都会被缓存。当您第二次尝试获取同一类的记录器时 - 它只是从内部映射中检索。
因此,如果您的层次结构中有 5 个类 - 无论您调用 getLogger(getClass())
多少次,都只会创建 5 个 Logger
对象。
关于java - 从子类进行静态类相关的对象初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11544895/