2012-09-07 22 views
6

Estoy empezando con Java e intento registrar algo.Java Logger - Sugerencia de Netbeans "Uso ineficaz de la concatenación de cadenas en el registrador"

private static final Logger _logger = Logger.getLogger("my"); 

String car = "bmw"; 
String dog = "dog"; 

_logger.info(car + " text " + dog); // on this line Netbeans 

.. en esta línea Netbeans muéstrame bombilla amarilla y dicen: El uso ineficiente de la concatenación de cadenas en el registrador de

Así que haga clic en "Convertir la concatenación de cadenas a una plantilla de mensaje" y se cambie el código a:

_logger.log(Level.INFO, "[{0}] v{1} enabled", new Object[]{car, dog}); 

Eso causa problema. Porque en el registro veo: [{0}] v{1} enabled ¿Cómo solucionarlo?

+1

Pruebe '_logger.log (Level.INFO, String.format (" [{0}] v {1} habilitado ", nuevo Object [] { coche, perro})) ' –

+0

@Ryan Amos: Debes publicar eso como una respuesta y se debe hacer algo sobre el título de la pregunta – nevets1219

+0

@ nevets1219 Lo hice. –

Respuesta

9

Usted tiene algunas opciones

1) Uso String.Format() _logger.log(Level.INFO, String.format("[%s] %s enabled", car, dog)).

2) Use StringBuilder.append() o String.concat() `.

Ex: _logger.log(Level.INFO, new StrinBuilder(car).append(" text ").append(dog));

Esto es esencialmente lo que hace javac en la optimización.

3) Ignore la advertencia porque la eficiencia es irrelevante para esto. Si realmente te importa la velocidad, no estarías registrando cosas. El registro lleva mucho tiempo, y la diferencia entre el formato de cadena y la cadena que se agrega es muy pequeña en relación con el tiempo dedicado a escribir el registro.

+0

Lo intento y es lo mismo. – user1571252

+0

@ user1571252 Pruebe la nueva cosa que puse. No uso String.format a menudo. –

+3

Existe una razón para usar argumentos en lugar de concatenación es evitar la creación de cadenas si el nivel de registro es mayor que INFO. Todas sus sugerencias crearán el String todo el tiempo. –

1

Es sólo ayudar a los consejos de Netbeans, en realidad código

_logger.info(car + " text " + dog); // on this line Netbeans 
_logger.log(Level.INFO, "{0} text {1}", new Object[]{car, dog}); 

producen la misma salida. La primera variante es más amigable con los codificadores, menos el tiempo para escribir mensajes de depuración, la segunda es impresionante.

+0

El objetivo de la API parametrizada es concatenar solo si realmente se necesita la cadena. Por ejemplo, imagine que el registro está configurado para solo generar mensajes 'SEVERE'. El uso de la segunda API permite que el marco omita el formato. Los mensajes parametrizados también son el punto de partida para localizar los mensajes de registro. –

+0

@DilumRanatunga ¿De qué API hablas? –

+0

'log (Level level, String msg, Object [] params)'. Estoy de acuerdo en que sería bueno si hubiera 'info (String msg, Object [] params)'. Si está preguntando acerca de la localización, entonces estoy hablando de los métodos 'log *' que tienen '* rb' al final, en particular' logrb (Level level, ..., Object [] params) '. –

0

Este es el formato real NetBeans 7.1.2 do

public class Vels4j { 

    private static final Logger _logger = Logger.getLogger("my"); 
    String car = "bmw"; 
    String dog = "dog"; 

    Vels4j() { 
     // _logger.info(car + " text " + dog); 
     _logger.log(Level.INFO, "{0} text {1}", new Object[]{car, dog}); 
    } 

    public static void main(String[] args) { 
     Vels4j vels4j = new Vels4j(); 
    } 
} 

Puede desactivar consejos si no quieres. También la sugerencia puede ser configurable.

1

Cualquier aproximación que genere la cadena desparámetro antes de determinar si el mensaje debe escribirse es ineficaz.

Es probable que tenga un java.util.logging.Formatter mal escrito. Por eso, me refiero a un formateador que simplemente da salida a LogRecord.getMessage() en lugar de incorporar LogRecord.getParameters()

+1

No se hizo nada mal escrito. –

Cuestiones relacionadas