[英]Is it bad practice to use method name as a parameter to logger when printing logs?
[英]Logger per instance, bad practice?
我有一个类(示例 FileConfig),它在程序的许多不同地方使用,并且该类也是其(插件)API 的一部分。 所以这个类应该是非常通用和广泛可用的。 我想在这个类java.util.logging.Logger
使用一个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
字段相同。 这段代码有问题吗? 有什么我应该避免的理由吗? 无论出于何种原因,这是不好的做法吗? 如果是,为什么? 我也很感激您对此的个人意见或如何改进它的建议。
这段代码有问题吗?
使用记录器的线程和改变记录器的线程之间没有线程安全的协调。 没有 JavaDoc 说明使用假设。
有什么我应该避免的理由吗?
拥有一个可以在构造后调用的方法setLogger
可能允许消息在处理程序之间被撕裂。 更改类的记录器似乎应该需要权限检查。
我也很感激您对此的个人意见或如何改进它的建议。
您不禁止子类,因此检查类名可能更安全:
import java.util.logging.Logger;
public class FileConfig {
private final Logger logger = Logger.getLogger(getClass().getName());
}
想要使用不同记录器的调用者可以子类化“FileConfig”。 这允许在调用者的命名空间中创建子类,这通常是您在组合对象时想要实现的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.