在可序列化 Java 类中使用记录器的正确方法是什么?

2024-04-28

我有以下(doctored)我正在开发的系统中的类以及Findbugs http://findbugs.sourceforge.net/正在生成一个SE_BAD_FIELD http://findbugs.sourceforge.net/bugDescriptions.html#SE_BAD_FIELD警告,在我按照我的想法修复它之前,我试图理解为什么它会这么说。我感到困惑的原因是因为描述似乎表明我在类中没有使用其他不可序列化的实例字段,但 bar.model.Foo 也不可序列化并以完全相同的方式使用(据我所知)可以告诉)但 Findbugs 不会生成任何警告。

import bar.model.Foo;

import java.io.File;
import java.io.Serializable;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Demo implements Serializable {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private final File file;
    private final List<Foo> originalFoos;
    private Integer count;
    private int primitive = 0;

    public Demo() {
        for (Foo foo : originalFoos) {
            this.logger.debug(...);
        }
    }

    ...

}

我最初对解决方案感到羞愧的是在使用它时从工厂获取记录器参考:

public DispositionFile() {
    Logger logger = LoggerFactory.getLogger(this.getClass());
    for (Foo foo : originalFoos) {
        this.logger.debug(...);
    }
}

但这似乎并不是特别有效。

想法?


首先,不要过早优化。可能是这样LoggerFactory.getLogger()足够快,并且不会对执行时间造成显着的开销。如果有疑问,请对其进行分析。

其次,findbugs 没有抱怨使用的原因Foo是因为该类没有类型字段Foo,它有一个类型字段List。泛型在编译时被删除,没有实际引用Foo在类中,就字段定义而言。在运行时,事实是Foo如果您尝试序列化其实例,则不可序列化会导致异常Demo类,但 findbugs 无法知道这一点。

我的第一反应是Logger静态字段,而不是实例字段。在这种情况下应该可以正常工作。

public class Demo implements Serializable {
   private static final Logger logger = LoggerFactory.getLogger(Demo.class);

   // .. other stuff
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在可序列化 Java 类中使用记录器的正确方法是什么? 的相关文章

随机推荐