L'enregistreur doit-il être déclaré statique ou non? Habituellement, j'ai vu deux types de déclaration pour un enregistreur:
log log protégé = nouveau Log4JLogger (aClass.class);
ou
journal statique privé du journal = nouveau Log4JLogger (aClass.class);
Lequel faut-il utiliser? Quels sont les avantages et les inconvénients des deux?
static
est une référence par classe. non-statique est une référence par instance (+ initialisation). Donc, dans certains cas, ce dernier a un impact important sur la mémoire si vous avez des tonnes d'instances. N'utilisez jamais le non-statique dans un objet fréquent . J'utilise toujours la version statique. (qui devrait être en majusculeLOG
)private static final Log log
minuscules. L'enregistreur n'est pas une constante, l'enregistreur est un objet final statique (qui peut être muté). Personnellement, j'utilise toujourslogger
.Réponses:
L'avantage de la forme non statique est que vous pouvez la déclarer dans une classe de base (abstraite) comme suit sans vous soucier que le bon nom de classe sera utilisé:
Cependant, son inconvénient est évidemment qu'une toute nouvelle instance de journalisation sera créée pour chaque instance de la classe. Cela peut ne pas être cher en soi, mais cela ajoute une surcharge importante. Si vous souhaitez éviter cela, vous souhaitez utiliser le
static
formulaire à la place. Mais son inconvénient est à son tour que vous devez le déclarer dans chaque classe individuelle et veiller dans chaque classe à ce que le bon nom de classe soit utilisé pendant la construction de l'enregistreur cargetClass()
il ne peut pas être utilisé dans un contexte statique. Cependant, dans l'EDI moyen, vous pouvez créer un modèle de saisie semi-automatique pour cela. Par exemplelogger
+ctrl+space
.D'un autre côté, si vous obtenez le logger par une fabrique qui à son tour peut mettre en cache les loggers déjà instanciés, alors l'utilisation du formulaire non statique n'ajoutera pas beaucoup de surcharge. Log4j par exemple a un
LogManager
pour cela.la source
abstract Log getLogger();
dans la classe abstraite. Implémentez cette méthode en renvoyant le journal statique pour l'instance particulière. Ajoutezprivate final static Log LOG = LogManager.getLogger(Clazz.class);
à votre modèle de classe IDE.protected Logger log = LoggerFactory.getLogger(getClass());
J'avais l'habitude de penser que tous les enregistreurs devraient être statiques; cependant, cet article sur wiki.apache.org soulève des problèmes de mémoire importants, concernant les fuites de classloader. La déclaration d'un enregistreur comme statique empêche la classe déclarante (et les chargeurs de classe associés) d'être récupérés dans les conteneurs J2EE qui utilisent un chargeur de classe partagé. Cela entraînera des erreurs PermGen si vous redéployez votre application suffisamment de fois.
Je ne vois vraiment aucun moyen de contourner ce problème de fuite de chargeur de classe, autre que de déclarer les enregistreurs comme non statiques.
la source
La différence la plus importante est la façon dont cela affecte vos fichiers journaux: dans quelle catégorie les journaux vont-ils?
Il existe une variante de votre premier cas:
journal protégé = nouveau Log4JLogger (getClass ());
Dans ce cas, votre catégorie de journal indique sur quel objet le code qui s'est connecté travaillait.
Dans votre deuxième choix (statique privé), la catégorie de journal est la classe qui contient le code de journalisation. Donc, normalement, la classe qui fait la chose qui est enregistrée.
Je recommanderais fortement cette dernière option. Elle présente ces avantages, par rapport aux autres solutions:
Il présente également des inconvénients:
la source
Utilisez l'inversion de contrôle et transmettez le logger au constructeur. Si vous créez le logger dans la classe, vous allez avoir un temps fou avec vos tests unitaires. Vous écrivez des tests unitaires, n'est-ce pas?
la source