sexta-feira, 21 de novembro de 2014

Quebra de linha em Java (não é tão banal quanto você pensa)

Saudações leitores !!!

O objetivo deste post será mostrar que não é tão banal executar uma instrução de quebra linha em Java. Então, nesse momento você deve estar pensando:

"Porque ele tá complicando um assunto tão fácil ? É só aplicar um \n caso, queria pular linha e pronto !."

Então, eu respondo: "Não é tão banal assim !!". Existem particularidades que, se não forem consideradas podem causar uma certa dorzinha de cabeça.

Sem mais tardar, vamos começar a por a mão na massa. Pegue um café, acenda seu cigarro e vamos lá.

Existe mais de uma forma de pular linha em Java sem usar o \n. Você pode usar o seguinte comando:

 System.getProperty("line.separator");  

ou, você pode usar o \r ou (char) 13 ou (char) 10.

Agora, acalma-se pois, as explicações irão começar.

Devemos nos lembrar que estamos em um ambiente Windows e isso faz toda a diferença. O comando acima recupera os metacaracteres de quebra de linha do sistema operacional e para cada sistema operacional essa valor muda. Como estamos no Windows, os metacaracteres são o \n e o \r. No Unix é somente o \n e no Mac, somente o \r.

Você ainda deve estar se perguntando para que serve o (char)13 e o (char)10. Isto é nada mais, nada menos que, a invocação desses metacaracteres pelo seu keyCode, ou seja, atingiremos os mesmos resultados se executarmos essas expressões.

 System.out.println("foo" + (char)13 + "foo2");  
 System.out.println("foo" + (char)10 + "foo2");  
 System.out.println("foo" + '\n' + "foo2");  
 System.out.println("foo" + '\r' + "foo2");  
 System.out.println("foo" + System.getProperty("line.separator") + "foo2");  

Resultado esperado

 foo  
 foo2  

Agora que você entendeu o que é cada um, você se pergunta: "Qual devo usar ?"

Para dar uma boa resposta à essa pergunta, devemos nos questionar em qual contexto estamos. Se estivermos em um contexto de um sistema que terá de funcionar em qualquer plataforma, abono as abordagens: \n, \r, (char)10, (char)13; porque não serão soluções que funcionarão em qualquer SO, sobrando assim System.getProperty("line.separator").

Em situações em que sabemos que o sistema funcionará somente em uma plataforma, recomendo a sua própria abordagem de quebra de linha ou o System.getProperty("line.separator"). Porém, como programador, não recomendo você a usar o (char) 13 ou (char)10 para situações "mundanas" pois, você está adicionando complexidade desnecessária ao seu código, visto que existem soluções mais conhecidas por todos os desenvolvedores. Lembre que um dia o código que você escreveu, sofrerá manutenção por outras pessoas. É importante ressaltar também que para outro SO, os keyCodes podem mudar. Logo, você estará engessado em uma plataforma.

Galera, espero ter agregado um conteúdo de alto nível com este post. Se você achou erros, tem sugestões, elogios ou críticas, deixe aí embaixo nos comentários.

Até a próxima.


Nenhum comentário: