2011-03-11 20 views
8

Estoy buscando una referencia "propia" a la clase actual en JAVA de una manera de contexto estático como en PHP Scope Resolution Operator?Referencia "propia" (estática) Java

Solución: ¿Salir del alcance? Tenga cuidado, esto se compara con una definición estática muy lenta (por el factor 300):

static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName()); 

La manera pasada de moda sería:

static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName()); 

¿Hay alguna alternativa? Estoy buscando una forma de poner la definición del registrador en una clase abstracta. El registrador debe determinar la clase desde la que se llama.

Respuesta

12

El ligeramente más rápido

static final Logger LOG = LoggerFactory.getLogger(
     Thread.currentThread().getStackTrace()[0].getClassName()); 

Si hace esto 1000 veces tardará 36 ms utilizando Class.class.getName() y 60 ms hacerlo de esta manera. Tal vez no vale la pena preocuparse por demasiado. ;)

3

No debe heredar el registrador. Simplemente declare el registrador en cada clase.

Pero si usted no quiere hacer este tipo de reflexión útil, simplemente no lo hacen estática)

0

No creo que existen otras alternativas que son significativamente diferentes a los dos en su pregunta.

Se puede crear un método de ayuda como esto:

public static String getCallingClassname() { 
    return new RuntimeException().getStackTrace()[1].getClassName(); 
} 

y luego

static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname()); 

pero eso es tan caro como la versión original. (FWIW: 300 veces más lento probablemente no sea una preocupación importante, a menos que tenga miles de estos registradores. Cada uno de estos estáticos se inicializa solo una vez ...)

Mi preferencia personal es la forma "anticuada" de haciéndolo.

Cuestiones relacionadas