gpt4 book ai didi

java - 每个实例记录器,不好的做法?

转载 作者:行者123 更新时间:2023-11-30 05:31:55 24 4
gpt4 key购买 nike

我有一个类(例如 FileConfig),它在程序中的许多不同位置使用,并且该类也是其(插件)API 的一部分。所以这个类应该是非常通用和广泛可用的。我想在此类中使用 Logger (java.util.logging.Logger)。每个类使用 private static final Logger 实例似乎是最佳实践,如许多代码示例所示。在我看来,这对我来说非常不灵活。我可以想到我或使用 API 的人想要对程序的特定部分使用不同的 Logger 实例的情况。下面的代码展示了我解决这个问题的想法。

import java.util.logging.Logger;

public class FileConfig {
private static final Logger LOGGER = Logger.getLogger(FileConfig.class.getName());
private Logger logger = LOGGER;

public void setLogger(Logger logger) {
if (logger == null) {
throw new IllegalArgumentException("logger cannot be null");
}

this.logger = logger;
}
}

这使得每个实例可以使用不同的Logger,而默认行为仍然与仅具有static Logger 字段相同。这段代码有问题吗?我有理由避免这种情况吗?无论出于何种原因,这种做法都是不好的吗?如果是,为什么?我也非常感谢您对此的个人意见或建议如何改进它。

最佳答案

Are there any problems with this code?

使用记录器的线程和更改记录器的线程之间没有线程安全的协调。没有 JavaDoc 说明使用假设。

Is there a reason why I should avoid that?

拥有一个可以在构造后调用的方法setLogger可能会允许消息在处理程序之间撕裂。更改类的记录器似乎需要权限检查。

I would also appreciate your personal opinion about this or suggestion how to improve it.

您不会禁止子类,因此检查类名可能会更安全:

import java.util.logging.Logger;

public class FileConfig {
private final Logger logger = Logger.getLogger(getClass().getName());
}

想要使用不同记录器的调用者可以对“FileConfig”进行子类化。这允许在调用者的 namespace 中创建子类,这通常是您在组合对象时想要实现的目标。

关于java - 每个实例记录器,不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57350923/

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