¿Debería declararse el registrador estático o no? Por lo general, he visto dos tipos de declaración para un registrador:
registro de registro protegido = nuevo Log4JLogger (aClass.class);
o
Registro de registro estático privado = nuevo Log4JLogger (aClass.class);
¿Cuál debería usarse? ¿Cuales son las ventajas y desventajas de ambos?
static
es una referencia por clase. no estático es una referencia por instancia (+ inicialización). Entonces, en algunos casos, este último tiene un impacto significativo en la memoria si tiene toneladas de instancias. Nunca use lo no estático en un objeto frecuente . Siempre uso la versión estática. (que debe estar en mayúsculasLOG
)private static final Log log
que esté en minúsculas. El registrador no es una constante, el registrador es un objeto final estático (que puede ser mutado). Personalmente siempre usologger
.Respuestas:
La ventaja de la forma no estática es que puede declararla en una clase base (abstracta) como sigue sin preocuparse de que se utilice el nombre de clase correcto:
Sin embargo, su desventaja es, obviamente, que se creará una instancia de registrador completamente nueva para cada instancia de la clase. Esto puede no ser caro en sí mismo, pero agrega una sobrecarga significativa. Si desea evitar esto, le gustaría utilizar el
static
formulario en su lugar. Pero su desventaja es, a su vez, que debe declararlo en cada clase individual y tener cuidado en cada clase de que se use el nombre de clase correcto durante la construcción del registrador porquegetClass()
no se puede usar en un contexto estático. Sin embargo, en el IDE promedio puede crear una plantilla de autocompletar para esto. Por ejemplo,logger
+ctrl+space
.Por otro lado, si obtiene el registrador de una fábrica que a su vez puede almacenar en caché los registradores ya instanciados, entonces el uso de la forma no estática no agregará demasiada sobrecarga. Log4j, por ejemplo, tiene un
LogManager
para este propósito.fuente
abstract Log getLogger();
en la clase abstracta. Implemente este método, devolviendo el registrador estático para la instancia en particular. Agregueprivate final static Log LOG = LogManager.getLogger(Clazz.class);
a su plantilla de clase IDE.protected Logger log = LoggerFactory.getLogger(getClass());
Solía pensar que todos los registradores deberían ser estáticos; sin embargo, este artículo en wiki.apache.org plantea algunas preocupaciones importantes sobre la memoria, con respecto a las fugas del cargador de clases. Declarar un registrador como estático evita que la clase declarante (y los cargadores de clases asociados) sean recolectados como basura en contenedores J2EE que usan un cargador de clases compartido. Esto resultará en errores de PermGen si vuelve a implementar su aplicación suficientes veces.
Realmente no veo ninguna forma de evitar este problema de fuga del cargador de clases, aparte de declarar los registradores como no estáticos.
fuente
La diferencia más importante es cómo afecta a sus archivos de registro: ¿en qué categoría van los registros?
Hay una variante de su primer caso:
registro de registro protegido = nuevo Log4JLogger (getClass ());
En ese caso, su categoría de registro dice en qué objeto estaba trabajando el código que registró.
En su segunda opción (estática privada), la categoría de registro es la clase que contiene el código de registro. Entonces, normalmente, la clase que está haciendo lo que se está registrando.
Recomendaría encarecidamente esa última opción. Tiene estas ventajas, en comparación con las otras soluciones:
También tiene desventajas:
fuente
Utilice la inversión de control y pase el registrador al constructor. Si crea el registrador dentro de la clase, se lo va a pasar muy mal con sus pruebas unitarias. Estás escribiendo pruebas unitarias, ¿no?
fuente