2010-11-24 22 views
5

J'utilise un singleton enum, mais l'implémentation de la journalisation est problématique. Ce:Comment implémenter la journalisation dans un singleton enum?

public enum Foo { 
    INSTANCE; 

    private final Logger log = Logger.getLogger(Foo.class.getName()); 

    ... 
} 

L'enregistreur est instancié de la manière que j'instancier un enregistreur pour une classe Java normale, mais bien sûr, je reçois l'erreur suivante:

Foo.java: illegal reference to static field from initializer 

est-il un moyen équivalent à connectez-vous enum singletons?

Répondre

15

En réponse à votre question, il suffit de l'enregistreur statique ...

BTW, je pense que sa pratique d'utiliser un enregistreur statique même pour les instances d'objet. En d'autres termes, l'enregistreur est sur la classe; tous les objets utilisent les références logger statiques.

Voir

http://logging.apache.org/log4j/1.2/manual.html

La plupart des exemples d'utilisation d'un enregistreur là-bas ont l'enregistreur comme une propriété statique ...

+2

+1 pour l'enregistreur statique. SLF4J a aussi une discussion intéressante: http://www.slf4j.org/faq.html#declared_static –

3

Connexion dynamique:

Logger.getLogger(Foo.class.getName()).info("log info"); 
+2

Ce serait très fastidieux de l'écrire à chaque fois. – harto

+1

Ce n'est vraiment pas le cas si vous utilisez un IDE. établissez-vous un modèle. Dans Eclipse, j'utilise "log" pour développer ce modèle à partir d'une entrée de journal de débogage rapide. – Nerdfest

+0

Quel est l'avantage de cette méthode? –

2

Un peu plus court: utilisez une méthode: logger(). debug (...)

private static Logger logger() 
{ 
    if(logger == null) 
    { 
     logger = Logger.getLogger(AnEnum.class); 
    } 

    return logger; 
} 

/** Logger **/ 
private static Logger logger;