Y a-t-il un avantage à utiliser {}
au lieu de la concaténation de chaînes?
Un exemple de slf4j
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
au lieu de
logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
Je pense que c'est une question d'optimisation de la vitesse, car l'évaluation des paramètres (et la concaténation de chaînes) pourraient être évitées au moment de l'exécution en fonction d'un fichier de configuration. Mais seuls deux paramètres sont possibles, alors parfois il n'y a pas d'autre choix que la concaténation de chaînes. Besoin de points de vue sur cette question.
la source
Version courte: Oui, c'est plus rapide, avec moins de code!
La concaténation de chaînes fait beaucoup de travail sans savoir si elle est nécessaire ou non (le test traditionnel "est le débogage activé" connu de log4j), et doit être évitée si possible, car le {} permet de retarder l'appel toString () et la construction de la chaîne après qu'il a été décidé si l'événement doit être capturé ou non. En ayant le format de l'enregistreur une seule chaîne, le code devient plus propre à mon avis.
Vous pouvez fournir n'importe quel nombre d'arguments. Notez que si vous utilisez une ancienne version de sljf4j et que vous avez plus de deux arguments à
{}
, vous devez utiliser lanew Object[]{a,b,c,d}
syntaxe pour passer un tableau à la place. Voir par exemple http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object []) .Concernant la vitesse: Ceki a posté un repère il y a quelque temps sur l'une des listes.
la source
debug(String format, Object... arguments)
. Voir slf4j.org/faq.html#logging_performanceDepuis, String est immuable en Java, les String gauche et droit doivent donc être copiés dans le nouveau String pour chaque paire de concaténation. Alors, mieux vaut opter pour l'espace réservé.
la source
Une autre alternative est
String.format()
. Nous l'utilisons dans jcabi-log (wrapper d'utilitaire statique autour de slf4j).C'est beaucoup plus maintenable et extensible. De plus, c'est facile à traduire.
la source
value
changement, vous devez revenir en arrière et modifier également l'instruction de journalisation. Quelque chose pour lequel les IDE ne vous aideront pas. Les enregistreurs doivent aider au débogage et ne pas y gêner. :-)String.format("%d", "Test")
produit l'avertissement IntelliJArgument type 'String' does not match the type of the format specifier '%d'.
. Cependant, je ne suis pas sûr qu'il serait toujours en mesure de fournir cette réponse intelligente en travaillant avec la solution ci-dessus.Je pense que du point de vue de l'auteur, la raison principale est de réduire la surcharge pour la concaténation de chaînes.Je viens de lire la documentation de l'enregistreur, vous pouvez trouver les mots suivants:
la source