¿Hay alguna ventaja de usar en {}
lugar de la concatenación de cadenas?
Un ejemplo de slf4j
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
en vez de
logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
Creo que se trata de la optimización de la velocidad porque la evaluación de parámetros (y la concatenación de cadenas) podrían evitarse en tiempo de ejecución dependiendo de un archivo de configuración. Pero solo son posibles dos parámetros, entonces a veces no hay otra opción que la concatenación de cadenas. Necesita opiniones sobre este tema.
fuente
Versión corta: ¡Sí, es más rápido, con menos código!
La concatenación de cadenas hace mucho trabajo sin saber si es necesaria o no (la prueba tradicional de "depuración habilitada" conocida por log4j), y debe evitarse si es posible, ya que {} permite retrasar la llamada toString () y la construcción de cadenas hasta después de que se haya decidido si el evento necesita capturarse o no. Al hacer que el registrador formatee una sola cadena, el código se vuelve más limpio en mi opinión.
Puede proporcionar cualquier número de argumentos. Tenga en cuenta que si usa una versión anterior de sljf4j y tiene más de dos argumentos
{}
, debe usar lanew Object[]{a,b,c,d}
sintaxis para pasar una matriz en su lugar. Consulte, por ejemplo , http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object []) .En cuanto a la velocidad: Ceki publicó un punto de referencia hace un tiempo en una de las listas.
fuente
debug(String format, Object... arguments)
. Ver slf4j.org/faq.html#logging_performanceDado que String es inmutable en Java, la String izquierda y derecha deben copiarse en la nueva String para cada par de concatenación. Entonces, mejor opta por el marcador de posición.
fuente
Otra alternativa es
String.format()
. Lo estamos usando en jcabi-log (envoltorio de utilidad estática alrededor de slf4j).Es mucho más fácil de mantener y ampliar. Además, es fácil de traducir.
fuente
value
cambios, debe volver atrás y cambiar la declaración de registro también. Algo con lo que los IDE no te ayudarán. Los registradores deben ayudar con la depuración y no interponerse en ella. :-)String.format("%d", "Test")
produce la advertencia de IntelliJArgument type 'String' does not match the type of the format specifier '%d'.
. Sin embargo, no estoy seguro de que pueda proporcionar esta respuesta inteligente al trabajar con la solución anterior.Creo que desde el punto de vista del autor, la razón principal es reducir la sobrecarga de la concatenación de cadenas. Acabo de leer la documentación del registrador, puede encontrar las siguientes palabras:
fuente