2012-01-06 12 views
10

Voglio solo sapere qual è il modo migliore per dichiarare la variabile logger in java. Di seguito sono riportate alcune dichiarazioni.Qual è il modo migliore per dichiarare la variabile logger in java

1> private static final Logger logger = Logger.getLogger(ServiceImpl.class); 

2> private static Logger logger = Logger.getLogger(ServiceImpl.class); 

3> private static final Logger LOGGER= Logger.getLogger(ServiceImpl.class); 

4> private static Logger LOGGER= Logger.getLogger(ServiceImpl.class); 

P.S Apprezzo davvero se qualcuno conosce altri modi alternativi migliori per dichiarare variabile looger.

+2

Fino a te, ma dovresti usare le versioni 'final' – fge

+0

possibile duplicato di [Un" Logger finale statico "deve essere dichiarato in MAIUSCOLO?] (http://stackoverflow.com/questions/1417190/should-a-static-final-logger-be-declared-in-upper-case) – dogbane

risposta

6

Io voto per

private static final Logger LOGGER = Logger.getLogger(ServiceImpl.class); 

E 'final dal momento che non cambiarlo ed è in maiuscolo dal momento che è una costante.

+1

NON deve essere maiuscolo. "Java Coding Style Guide", "Google Java Style" dice che dovrebbe essere "logger" in minuscolo. Si sta discutendo qui: http://stackoverflow.com/q/1417190/603314 –

0

primo è best.I preferiscono logger di essere final e static ....

+0

Perché è così? –

+0

@abhutra: grazie per la rapida risposta. ma le regole di PMD dicono che la variabile finale statica dovrebbe essere capitale. – Raje

1

Vorrei andare con la prima opzione, ma è questione di scelta personale immagino.

+0

ma le regole PMD dicono che la variabile finale statica dovrebbe essere capitale – Raje

+1

@Raje: PMD è intenzionalmente ottuso in questo caso. Guarda qualsiasi campo finale statico in una classe di libreria standard Java (ad es. 'Sistema') che non è una costante" reale "(cioè non primitiva o' String'). Non usano nomi maiuscoli per queste variabili. –

+0

Buon punto Sanjay. –

11

Tutti i nomi delle variabili in maiuscolo sono fuori IMO perché in realtà non si sta dichiarando/definendo una costante ma una variabile statica. I nomi maiuscoli sono più adatti per "costanti". Detto questo, personalmente andrei con il primo approccio.

private static final Logger logger = Logger.getLogger(ServiceImpl.class); 
+3

Sono completamente d'accordo con la tua dichiarazione. Inoltre, quando hai LOGGER, sembra che quella variabile ti stia solo gridando per la tua attenzione che non dovrebbe accadere. – Jeach

0

Nella mia comprensione della guida di stile java, 'logger' è il migliore. 'LOGGER' sarebbe per una costante definita.

Inoltre, l'utilizzo di "final" dovrebbe renderlo un po 'più veloce.

Quindi # 1.

3

Personalmente ritengo private static final Logger LOGGER= Logger.getLogger(ServiceImpl.class); è il modo migliore per andare per semantiche e le prestazioni motivi:

  • il registro appartiene alla classe, non a varie istanze di esso, per questo motivo si dovrebbe rendere statico
  • dovrebbe essere privato perché è usato internamente dalla classe, non fa parte dell'API pubblica
  • , rendendo il finale due ha senso, prima di tutto perché questo afferma che la refferenza non cambierà (che è il caso qui) e seconda perché le variabili di intance finale (in particolare quelle statiche) possono essere meglio ottimizzate per velocità dal compilatore e dalla JIT (maggiori dettagli here)
  • nominare tutto maiuscolo è in realtà solo una bella convenzione, è così che le variabili statiche sono dichiarate in Java, non è davvero un dovere ma rende il codice più leggibile
0

mi sento di raccomandare di non usare un tale variabile in ogni classe, ma invece delegare questo lavoro ad un programma di utilità involucro statico intorno slf4j, da jcabi-log:

Logger.debug(this, "some variable = %s", value); 

Controllare questo post così: http://www.yegor256.com/2014/05/23/avoid-java-static-logger.html

+0

Anche se è un po 'complicato da implementare se si desidera avere il nome del file e la linea del chiamante nelle istruzioni del registro, al contrario della posizione della classe di utilità. Ma è effettivamente fattibile utilizzando 'org.slf4j.spi.LocationAwareLogger'. – ddekany

0

È buona prassi di programmazione condividere un singolo oggetto logger tra tutte le istanze di una particolare classe e utilizzare lo stesso logger per la durata del programma, quindi utilizziamo static e final per i logger.

Non è consigliabile utilizzare più logger (scarsa pratica di registrazione) piuttosto che livelli di registrazione.

penso che

private static final Logger logger = Logger.getLogger(ServiceImpl.class); 

è l'opzione migliore.

+0

Tutte le dichiarazioni del logger nella domanda sono già 'statiche' e dichiarate come una variabile, la domanda si chiede se dovrebbe essere' finale' e nominato in 'UPPER' o' lower'. – Leigh

0

Nessuno qui utilizza LOG o log? Ho trovato più bello nella pratica. (Sicuramente non sono il primo a lavorare in un posto dove quello è lo standard, perché @Log4j in Lombok genera anche un campo log. Naturalmente è anche statico finale e BTW, questo è il modo migliore per dichiarare quel campo .. aggiungi un'annotazione @Log4j.)

Problemi correlati