【问题标题】:Static class-dependant object initialization from child classes来自子类的静态类依赖对象初始化
【发布时间】:2012-07-18 15:28:03
【问题描述】:

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

import org.apache.log4j.Logger;

public abstract class A {

    private final static Logger logger;

        (...)

}

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

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

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

【问题讨论】:

    标签: java inheritance static


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我无法从静态范围调用 getClass。无论如何,这就是我的 IDE 所说的。
    • 谢谢,那我会做的。但这适用于 Apache 记录器的这种特定情况,我很好奇如何为任何其他静态对象解决这个问题。那你会怎么解决呢?
    • 我会创建相同类型的工厂对象(如 Logger),并在每次调用时生成新的对象实例。如果出于任何需要(性能/无状态对象/等)在某个时候我决定,我不想再创建新对象 - 我将在工厂对象中引入缓存。
    【解决方案2】:

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

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

    【讨论】:

    • 对不起,我的意思是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2020-04-14
    • 2011-02-17
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多