create - logger java definition
Contras para definir el registrador no estático (6)
Comentarios para esta respuesta ¿Cómo se reduce el código repetitivo del registro de Java? recomendamos encarecidamente no utilizar los registradores como variables de miembro de instancia. Puedo pensar en dos efectos secundarios negativos:
1) registros de la superclase con el registrador de la subclase
2) el objeto no se puede serializar (a menos que se marque como transitorio)
Pero si la serialización no es necesaria y el registro con el nombre de la subclase no es un problema, ¿hay algo más que deba evitarse? Creo que reduce el código repetitivo y evita los errores de copiar y pegar al copiar la definición de variables del registrador de una clase a otra. Incluso el framework Spring (que creo que tiene muy buenos estándares de codificación) usa este método.
Intente depurar un error donde vea un mensaje generado por la clase SuperClass
cuando el error realmente está siendo registrado en la clase SubClass
. He visto varias situaciones en las que los desarrolladores crean una clase LoggingUtils
que genera mensajes que generalmente duplican las cosas que ya están almacenadas en el marco de registro.
La única situación real que veo al usar una instancia de registro compartido es algo así como el httpclient.wire
logger httpclient.wire
Apache commons que se comparte entre varias clases para registrar el contenido de las solicitudes y respuestas enviadas a través del cliente. Esta situación de registro en particular no registra la información para la implementación real del paquete, sino que registra la información acerca de la "transacción" http completa.
La diferencia más importante aparte del registro de Superclass con el nombre de la subclase, por supuesto, es que tendrá un objeto Logger
por miembro de su clase. Dependiendo de cuántas clases usen el registro, esto puede ser una gran cantidad de Registradores, por lo que la acumulación de memoria puede ser un problema.
Además, desde un punto de vista abstracto, el registrador realmente pertenece a la clase y se puede compartir entre todas las instancias, en lugar de que cada instancia necesite su propia copia privada, por lo que tiene sentido declararlo como estático. Pasando la pregunta, ¿qué ventajas tiene para que no sea estática? (Ser capaz de pasar getClass()
a la llamada getLogger()
lugar de pasar la constante de clase es lo único que se me ocurre, y eso es algo muy pequeño).
Otra, probablemente menor, memoria perdida, especialmente cuando tienes muchas instancias, cada una con su propio registrador
Si su registrador es un miembro de instancia en lugar de estático, el registrador debe recuperarse cada vez que se crea un objeto nuevo. Aunque esta sobrecarga es probablemente insignificante, pero es una desventaja.
Desde el punto de vista del diseño, los Madereros no son realmente propiedad de un objeto, ya que generalmente son metainformación sobre su sistema en lugar de información comercial dentro del sistema mismo. Un Logger
no es realmente parte de algo como un objeto de Car
de la misma manera que un Engine
o una Transmission
. La vinculación de los registradores a los objetos como miembros (en la mayoría de los casos) no tiene sentido semánticamente más que cualquier otra cosa.
Es posible que desee echar un vistazo a estas páginas sobre el tema:
Una de las principales preocupaciones es limpiar instancias de memoria. Incluso si no crea objetos de una clase, dado que usa instancias estáticas de registrador, habrá referencias a esos objetos.
También, como dice apache, esto mantiene referencias para que no se liberen una vez después de su uso.
El uso del calificador estático puede ser beneficioso en algunas circunstancias. Sin embargo, en otros, es una muy mala idea y puede tener consecuencias inesperadas.
El resultado técnico del uso de estática es obvio: solo hay una referencia de registro compartida en todas las instancias de la clase. Esto es claramente eficiente en la memoria; solo se necesita una referencia (4 u 8 bytes) sin importar cuántas instancias se creen. También es eficiente con la CPU; la búsqueda requerida para encontrar la instancia de registro solo se realiza una vez, cuando se hace referencia por primera vez a la clase.