2011-03-20 15 views
5

Necesito poder imprimir en producción al registrador, pero durante el desarrollo me gustaría imprimir en la consola. Entonces en C++ simplemente usaría una macro para eso, y eso sería un cambio de 1 línea, ¿cómo puedo hacer eso en java? Graciascómo implementar macros en java

+0

¿Está interesado en implementar/usar el registro con java o macros? –

+0

Java no tiene macros, pero tiene la ventaja de ser más dinámico. Significa que puede desactivar de manera eficiente algo en tiempo de ejecución que debería deshabilitar en tiempo de compilación en C++. Java evita la necesidad de compilar muchas versiones de código para activar y desactivar varias opciones. Puede hacerlo optimizando el código según cómo se usa realmente. –

Respuesta

2

Simplemente defina un método estático y llámelo. En ese método, ponga una constante que esté configurada en true cuando está depurando y ejecute código diferente dependiendo de si está depurando o no.

1

En general, escriba una función que lea una propiedad del sistema para saber dónde imprimir.

O, para este caso específico, use log4j que le permite especificar cosas como esta en un archivo de configuración.

9

Las macros no son la respuesta correcta, utilizando un buen marco de registro es. Mire SLF4J (o el anterior log4j). Si enrutas todas tus llamadas de registro a través de una de estas fachadas, podrás enviar tus mensajes registrados a la consola, o un archivo, o cualquier otro apéndice que quieras con un poco de configuración.

4

Java no tiene macros similares a C/C++, por lo que no hay una manera fácil de desactivar automáticamente todo su código de registro. Lo que puede hacer es algo como esto:

public class Utility { 
    private Utility() {} // Singleton 

    public static void log(String toLog) { 
     System.out.println(toLog); 
    } 
    /* ... etc. ... */ 
} 

Ahora, en cualquier parte del programa que desea registrar un evento, sólo puede llamar a

Utility.log("Here's a message!"); 

En la producción crece, puede silenciar esta salida simplemente cambiando la implementación de log para que no funcione.

Esto no es tan eficiente como el C/C++ - ismo de tener su macro de registro expandirse a la nada en tiempo de compilación, pero un buen optimizador/JIT debería ser capaz de notar que el argumento no se está usando y Optimice la lógica para configurar esos argumentos.

1

Java no admite directamente un preprocesador y, por lo tanto, no admite macros.

El registro, sin embargo, es una necesidad común, por lo que hay varias opciones para elegir. Por el momento, lo mejor es usar slf4j (ya que las {} -construcciones permiten un buen código), con un back-end adecuado. Para empezar, el backend "slf4j-simple" en la distribución slf4j es agradable.

Tenga en cuenta que el autor slf4j favorece fuertemente el back-end de logback. Por ahora, no necesitas eso.

0

Mi respuesta es un poco tarde - ¡4 años! :)

Pero solo para el registro, si debe usar macros simplemente ejecute el preprocesador de C++ sobre el código de Java antes de compilar. Por supuesto, esto supone que utiliza la sintaxis de macro C++.

Si usted no recuerda lo que hace esto, el preprocesador simplemente sustituye los puntos #define ...

Dicho esto estoy de acuerdo con lo anterior - utilizar un marco decente (aunque en mi humilde opinión es un poco tonto no tener macros en Java).

Cuestiones relacionadas