Java 从子类进行静态依赖于类的对象初始化

Java 从子类进行静态依赖于类的对象初始化,java,inheritance,static,Java,Inheritance,Static,我有一个父抽象类,它定义了一个Apache logger静态对象。大概是这样的: import org.apache.log4j.Logger; public abstract class A { private final static Logger logger; (...) } 我知道此代码是非法的,因为记录器对象未初始化。问题是我不想用logger=logger.getLogger(A.class)初始化它;因为我希望每个子类用自己的类对象初始化它,这样

我有一个父抽象类,它定义了一个Apache logger静态对象。大概是这样的:

import org.apache.log4j.Logger;

public abstract class A {

    private final static Logger logger;

        (...)

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

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


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

用创建它的实际类初始化它:

logger = Logger.getLogger(getClass()); //log4j way of creating loggers
为此,您需要从
记录器
声明中删除
静态
修饰符。 我更喜欢将它保持为私有的,并通过getter方法访问它,但是您也可以将它设置为受保护的,并直接从
a
子类进行访问

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

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

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


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

对不起,这就是我的真正意思。我不能从静态范围调用getClass。不管怎样,我的IDE就是这么说的。谢谢,到时候我会这么做的。但这适用于ApacheLogger的这个特定案例,我很好奇如何解决任何其他静态对象的问题。那个么您将如何解决它呢?我将创建相同类型的工厂对象(如Logger),并在每次调用它时生成对象的新实例。如果出于某种需要(性能/无状态对象/等等),我决定不再创建新对象,我将在factory对象中引入缓存。