El mensaje no se refiere al costo de la concatenación de cadenas en sí mismo. Las otras respuestas son absolutamente correctas cuando dicen que se usará un StringBuilder.
La razón principal para usar una plantilla de mensaje es porque el procesamiento solo se realiza cuando se muestra el nivel de registro.
Usemos estos dos ejemplos:
srcLogger.getLogger().log(Level.INFO,"UploadBean.doUpload completado [" + file.getName() + "]\n");
srcLogger.getLogger().log(Level.INFO, "UploadBean.doUpload completado [{0}]\n", file.getName());
Con información de depuración de nivel en: Ambos tienen que obtener el nombre de archivo del archivo, ambos tienen que actualizar la cadena, generar uno nuevo, mostrarlo.
Con nivel de depuración INFO apagado: La segunda respuesta pasa por el nombre del objeto File (que es una consulta simple), el método log() comprueba el nivel INFO y lo devuelve inmediatamente. ¡No se realiza el procesamiento String
en absoluto!
Imaginemos ahora que, en lugar de un simple file.getName()
, estábamos registrando un objeto más complejo, que en sí mismo necesitaba mucha concatenación de cadenas en el método toString()
. Al registrar esos objetos directamente, no se realiza ninguno de esos procesos. toString()
ni siquiera se llama a menos que se muestre el nivel de depuración.
Por lo tanto, la plantilla de mensaje no es más eficiente en el caso donde se muestra el registro, pero es enormemente más eficiente (particularmente en casos de registro no trivial) cuando el registro no se muestra. Uno de los objetivos del registro debe ser que, si el registro se desactiva, tenga el menor impacto posible en el rendimiento del sistema.
Para desactivar la advertencia (en NetBeans 7.2.1): Preferencias -> Editor -> Sugerencias -> Registro -> Concatenación de cadenas en el registrador. La descripción dice: " No es eficiente en el rendimiento para concatenar cadenas en los mensajes del registrador. Es mejor usar un mensaje de plantilla con marcadores de posición que se reemplazan por valores concretos solo cuando el mensaje realmente se va a registrar". –
Realmente te perdiste una de las principales ventajas, añadiré una respuesta ahora aunque sea tarde :) –
Pero la advertencia es una ineficiencia debido a que la concatenación siempre se ejecuta en lugar de ejecutarla solo dependiendo del nivel de registro actual en el caso de usar el ['log (Level level, String msg, Object [] params)'] (https://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html # log-java.util.logging.Level-java.lang.String-java.lang.Object: A-) method. – Adam