2011-03-20 11 views
5

Devo essere in grado di stampare in produzione per il logger, ma durante lo sviluppo mi piacerebbe stampare sulla console. Quindi in C++ vorrei semplicemente usare una macro per questo, e quello sarebbe un cambio di 1 linea, come posso farlo in java? Graziecome implementare i macro in java

+0

Sei interessato all'implementazione/utilizzo della registrazione con java o macro? –

+0

Java non ha macro ma ha il vantaggio di essere più dinamico. Significa che puoi disabilitare in modo efficiente qualcosa in fase di esecuzione che dovresti disabilitare al momento della compilazione in C++. Java evita la necessità di compilare molte versioni del codice per attivare e disattivare varie opzioni. Può farlo ottimizzando il codice in base a come viene effettivamente utilizzato. –

risposta

2

Basta definire un metodo statico e chiamarlo. In questo metodo inserisci una costante impostata su true quando esegui il debug e esegui codice diverso a seconda che tu stia eseguendo il debug o meno.

1

In generale, scrivere una funzione che legge una proprietà di sistema per sapere dove stampare.

Oppure, per questo caso specifico, utilizzare log4j che consente di specificare elementi come questo in un file di configurazione.

9

Le macro non sono la risposta giusta, utilizzando un buon quadro di registrazione è. Guarda SLF4J (o il precedente log4j). Se instradi tutte le tue chiamate di registrazione attraverso una di queste facciate, sarai in grado di inviare i tuoi messaggi registrati alla console, o un file, o qualsiasi altro appender che ti piace con un minimo di configurazione.

4

Java non ha macro C/C++ e quindi non esiste un modo semplice per disattivare automaticamente tutto il codice di registrazione. Che cosa si può fare è qualcosa di simile:

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

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

Ora, in qualsiasi punto del programma che si desidera registrare un evento, si può chiamare

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

Nella produzione si basa, è possibile disattivare questa uscita semplicemente cambiando l'implementazione di log come no-op.

Questo non è efficiente come il C/C++ - l'unica differenza con cui la macro di registrazione si espande al nulla in fase di compilazione, ma un buon ottimizzatore/JIT dovrebbe essere in grado di notare che l'argomento non viene utilizzato e ottimizzare la logica per impostare tali argomenti.

1

Java non supporta direttamente un preprocessore e quindi non supporta macro.

La registrazione, tuttavia, è un'esigenza comune, pertanto sono disponibili diverse opzioni. Al momento l'approccio migliore è usare slf4j (dato che i {} -constructs consentono un buon codice), con un backend adatto. Per i principianti il ​​back-end "slf4j-simple" nella distribuzione slf4j è bello.

Si noti che l'autore di slf4j è fortemente favorevole al backend di logback. Per ora, non ne hai bisogno.

0

La mia risposta è un po 'in ritardo - 4 anni! :)

Ma per la cronologia, se è necessario utilizzare macro, è sufficiente eseguire il preprocessore C++ sul codice Java prima della compilazione. Ovviamente questo presuppone l'utilizzo della sintassi della macro C++.

Se non ricordate quello che fa, il preprocessore solo sostituisce i punti # define'd ...

Detto questo sono d'accordo con quanto sopra - utilizzare un quadro decente (anche se secondo me è un po 'sciocco non avere macro in Java).