158 votes

Pourquoi avons-nous déclarer Enregistreurs de static final?

En java, pourquoi est-il préférable de les déclarer un enregistreur de static final?

private static final Logger S_LOGGER

230voto

Tomasz Nurkiewicz Points 140462
  • private - de sorte qu'aucune autre classe ne peut détourner votre enregistreur
  • static - donc, il y a un seul journal instance de chaque classe, mais aussi pour éviter les tentatives de sérialiser les bûcherons
  • final - pas besoin de changer l'enregistreur de données au cours de la durée de vie de la classe

Aussi, je préfère nom log pour être aussi simple que possible, mais descriptive.

EDIT: Cependant il existe une exception à ces règles:

private final Logger log = LoggerFactory.getLogger(getClass());

par opposition à:

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

L'ancien mode vous permet d'utiliser le même nom de l'enregistreur (nom de la classe réelle) dans toutes les classes tout au long de la hiérarchie d'héritage. Donc, si Bar s'étend Foo, les deux journaux d' Bar enregistreur. Certains trouvent qu'il est plus intuitif.

15voto

yegor256 Points 21737

Consultez ce blog post: se Débarrasser de Java Statique Bûcherons. C'est la façon dont vous utilisez slf4j avec jcabi-journal:

import com.jcabi.log.Logger;
class Foo {
  void save(File f) {
    Logger.info(this, "file %s saved successfully", f);
  }
}

Et n'utilisez jamais que le bruit statique.

6voto

Jon Skeet Points 692016

Quand vous voulez changer la valeur du champ?

Si vous n'êtes jamais aller pour modifier la valeur, rendant le champ final rend évident que vous ne serez jamais en modifier la valeur.

3voto

Pour répondre à cette question, vous devriez avoir demandé ce "statique" et "final".

Pour un Enregistreur, (je suppose que vous parlez de Log4J Enregistreur de classe) vous voulez une catégorie par catégorie. Ce qui devrait conduire au fait que vous l'attribuer qu'une seule fois, et il n'y a pas besoin de plus d'une instance de chaque classe. Et sans doute il n'y a aucune raison pour exposer l'objet Logger d'une classe à une autre, alors pourquoi ne pas le rendre privé et de suivre certaines OO-Principes.

Vous devriez noter, que le compilateur est capable de profiter des avantages de cette. Ainsi, votre code effectue un peu mieux :)

2voto

MarvinLabs Points 13401

Parce que c'est généralement le genre de fonctionnalité qui peut être partagée à travers toutes les instances de vos objets. Il ne fait pas beaucoup de sens (90% du temps) d'avoir un enregistreur différente pour les deux instances de la même classe.

Cependant, vous pouvez également voir parfois enregistreur de classes déclarées comme des singletons ou même simplement d'offrir des fonctions statiques pour ouvrir une session de votre stuff.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X