每个实例,不良练习



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"子类别属。这允许在呼叫者的命名空间中创建子类,这通常是您在编写对象时要实现的目标。

最新更新