i有一个类(示例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
字段相同。此代码有任何问题吗?有什么原因我应该避免这种情况吗?无论出于何种原因,这是不好的做法吗?如果是,为什么?我也要感谢您对此的个人看法或建议如何改进。
此代码有任何问题吗?
使用记录器和线程更改记录器之间的线程之间没有线程安全的协调。没有javadoc说明使用的假设。
有原因我应该避免这种情况吗?
具有可以在施工后调用的方法setLogger
,可能会允许在处理人员之间撕裂消息。更改课程的记录仪似乎应该需要许可检查。
我也感谢您对此的个人看法或建议如何改进。
您不禁止子类,因此检查班级名称可能会更安全:
import java.util.logging.Logger;
public class FileConfig {
private final Logger logger = Logger.getLogger(getClass().getName());
}
想要使用其他记录器的呼叫者可以将" Fileconfig"子类别属。这允许在呼叫者的命名空间中创建子类,这通常是您在编写对象时要实现的目标。