Existe alguma vantagem de usar em {}
vez da concatenação de string?
Um exemplo de slf4j
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
ao invés de
logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
Acho que se trata de otimização de velocidade, porque a avaliação de parâmetros (e concatenação de string) pode ser evitada em tempo de execução, dependendo de um arquivo de configuração. Mas apenas dois parâmetros são possíveis, então às vezes não há outra escolha a não ser a concatenação de string. Precisando de opiniões sobre este assunto.
fonte
Versão resumida: Sim, é mais rápido, com menos código!
A concatenação de string faz muito trabalho sem saber se é necessária ou não (o tradicional teste "está habilitado para depuração" conhecido no log4j) e deve ser evitada se possível, pois o {} permite atrasar a chamada toString () e a construção de string para depois de ter sido decidido se o evento precisa ser capturado ou não. Ao fazer o logger formatar uma única string, o código se torna mais limpo na minha opinião.
Você pode fornecer qualquer número de argumentos. Observe que se você usar uma versão antiga de sljf4j e tiver mais de dois argumentos para
{}
, deverá usar anew Object[]{a,b,c,d}
sintaxe para passar um array. Consulte, por exemplo , http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object []) .Com relação à velocidade: Ceki postou um benchmark um tempo atrás em uma das listas.
fonte
debug(String format, Object... arguments)
,. Consulte slf4j.org/faq.html#logging_performanceUma vez que String é imutável em Java, a String esquerda e direita devem ser copiadas na nova String para cada par de concatenação. Então, é melhor ir para o espaço reservado.
fonte
Outra alternativa é
String.format()
. Estamos usando-o em jcabi-log (wrapper de utilitário estático em torno de slf4j).É muito mais sustentável e extensível. Além disso, é fácil de traduzir.
fonte
value
alteração for alterado, você terá que voltar e alterar a instrução de registro também. Algo em que os IDEs não o ajudarão. Os registradores devem ajudar na depuração e não interferir nisso. :-)String.format("%d", "Test")
produz o aviso IntelliJArgument type 'String' does not match the type of the format specifier '%d'.
. Porém, não tenho certeza de que ainda seria capaz de fornecer essa resposta inteligente ao trabalhar com a solução acima.Acho que, do ponto de vista do autor, o principal motivo é reduzir a sobrecarga da concatenação de strings. Acabei de ler a documentação do logger, e você pode encontrar as seguintes palavras:
fonte