gpt4 book ai didi

java - 来自子类的静态类相关对象初始化

转载 作者:行者123 更新时间:2023-11-30 09:35:04 25 4
gpt4 key购买 nike

我有这个定义 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com