我有一个类(例如 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/