Tengo la siguiente (adulterada) clase en un sistema en el que estoy trabajando y Findbugs está generando una advertencia SE_BAD_FIELD y estoy tratando de entender por qué diría eso antes de que lo solucione de la manera en que pensé haría. La razón por la que estoy confundido es porque la descripción parece indicar que no he usado otros campos de instancia no serializables en la clase, pero bar.model.Foo tampoco es serializable y se usa de la misma manera (en la medida en que se puede decir) pero Findbugs no genera ninguna advertencia.¿Cuál es la forma correcta de usar un registrador en una clase Serializable de Java?
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(...);
}
}
...
}
Mi rubor inicial a una solución es conseguir una referencia registrador de la fábrica de la derecha como lo uso:
public DispositionFile() {
Logger logger = LoggerFactory.getLogger(this.getClass());
for (Foo foo : originalFoos) {
this.logger.debug(...);
}
}
que no parece particularmente eficiente, sin embargo.
¿Pensamientos?
Ceki ha informado de que durante el logback getLogger (...) el método es rápido "suficiente" para ser llamado cuando sea necesario, y no se utiliza solo en un campo estático. –
Eche un vistazo a la clase [Logger] (http://www.jcabi.com/jcabi-log/apidocs-0.7.7/com/jcabi/log/Logger.html) de [jcabi-log] (http://www.jcabi.com/jcabi-log/), que es un contenedor alrededor de SLF4J – yegor256
Lea [respuesta de Ceki] (http://stackoverflow.com/a/2818849/606662) si usa SLF 1.5.3 o posterior. –