gpt4 book ai didi

java - 在 Serializable Java 类中使用 Logger 的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 22:43:29 25 4
gpt4 key购买 nike

我正在处理的系统中有以下(已修改)类,并且 Findbugs正在生成 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 的实际引用。在运行时,如果您尝试序列化 Demo 类的实例,那么 Foo 是不可序列化的事实会导致异常,但 findbugs 无法知道这一点。

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

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

// .. other stuff
}

关于java - 在 Serializable Java 类中使用 Logger 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com