java - 从子类进行静态类相关的对象初始化

标签 java inheritance static

我有这个父抽象类,它定义了一个 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/

相关文章:

java - 将私有(private)方法设为静态以增加函数式编程的习惯

c# - 静态 C# 变量,由于数据库连接而引发错误

javascript - 使用 MooTools 类的静态方法和变量的最佳实践

java - 尝试在空对象引用上调用虚拟方法 'java.lang.String java.lang.Integer.toString()'

java - OnClick 在教程练习中导致错误

java:替换 url 中最后 2 个斜杠之间的字符串/

C++ 继承自未定义的模板类型

java - 为什么 Java 中需要 volatile

具有父类(super class)和子类签名的 Java 2 函数 - 尽 pipe 类的类型是子类,但仍选择父类(super class)

c# - 多态与继承