Vindo do Perl, com certeza estou faltando o meio "aqui-documento" de criar uma string de várias linhas no código-fonte:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
Em Java, tenho que ter aspas complicadas e sinais de mais em todas as linhas, pois concatenar minha sequência de múltiplas linhas do zero.
Quais são algumas alternativas melhores? Definir minha string em um arquivo de propriedades?
Editar : duas respostas dizem que StringBuilder.append () é preferível à notação positiva. Alguém poderia explicar por que eles pensam assim? Não parece mais preferível para mim. Estou procurando uma maneira de contornar o fato de que cadeias de linhas múltiplas não são uma construção de linguagem de primeira classe, o que significa que definitivamente não quero substituir uma construção de linguagem de primeira classe (concatenação de cadeias com mais) por chamadas de método.
Editar : para esclarecer mais a minha pergunta, não estou preocupado com o desempenho. Estou preocupado com questões de manutenção e design.
string1 + string2
você está alocando um novo objeto de string e copiando os caracteres de ambas as strings de entrada. Se você estiver adicionando n Strings, estará fazendo alocações n-1 e aproximadamente (n ^ 2) / 2 cópias de caracteres. O StringBuilder, por outro lado, copia e realoca com menos frequência (embora ainda faça as duas coisas quando você excede o tamanho do buffer interno). Teoricamente, há casos em que o compilador pode converter + para usar o StringBuilder, mas na prática quem sabe.Respostas:
Stephen Colebourne criou uma proposta para adicionar seqüências de várias linhas no Java 7.
Além disso, o Groovy já tem suporte para seqüências de várias linhas .
fonte
Parece que você deseja fazer um literal multilinha, que não existe em Java.
Sua melhor alternativa serão cordas que são apenas
+
juntas. Algumas outras opções que as pessoas mencionaram (StringBuilder, String.format, String.join) só seriam preferíveis se você começasse com uma matriz de strings.Considere isto:
Versus
StringBuilder
:Versus
String.format()
:Versus Java8
String.join()
:Se você deseja a nova linha para seu sistema específico, é necessário usar
System.lineSeparator()
, ou você pode usar%n
noString.format
.Outra opção é colocar o recurso em um arquivo de texto e apenas ler o conteúdo desse arquivo. Isso seria preferível para cadeias muito grandes, para evitar inchar desnecessariamente os arquivos de classe.
fonte
String.format
versão é que você precisa manter o formato sincronizado com o número de linhas.Em Eclipse, se você ativar a opção "text Fuga ao colar em um literal string" (em Preferências> Java> Editor> Typing) e colar uma cadeia multi-alinhada whithin citações, ele irá adicionar automaticamente
"
e\n" +
para todas as suas linhas.fonte
\r
s que o Eclipse coloca no Windows?Este é um encadeamento antigo, mas uma nova solução bastante elegante (com apenas quatro, talvez três pequenas desvantagens) é usar uma anotação personalizada.
Verifique: http://www.adrianwalker.org/2011/12/java-multiline-string.html
Um projeto inspirado nesse trabalho está hospedado no GitHub:
https://github.com/benelog/multiline
Exemplo de código Java:
As desvantagens são
<%= variable %>
) :-)E você provavelmente precisará configurar o Eclipse / Intellij-Idea para não reformatar automaticamente seus comentários do Javadoc.
Pode-se achar estranho (os comentários do Javadoc não são projetados para incorporar nada além de comentários), mas como essa falta de cadeia de linhas multilinhas no Java é realmente irritante no final, acho que essa é a pior solução.
fonte
Outra opção pode ser armazenar seqüências longas em um arquivo externo e ler o arquivo em uma sequência.
fonte
@
sintaxe para C # é muito mais limpa.Isso é algo que você nunca deve usar sem pensar no que está fazendo. Mas para scripts únicos, usei isso com grande sucesso:
Exemplo:
Código:
fonte
String.join
O Java 8 adicionou um novo método estático ao
java.lang.String
qual oferece uma alternativa um pouco melhor:String.join( CharSequence delimiter , CharSequence... elements )
Usando isso:
fonte
"\n"
é necessário e está ciente da portabilidade!O JEP 355: Blocos de Texto (Visualização) visa cobrir essa funcionalidade, atualmente está direcionando o JDK 13 como um recurso de visualização. Permitindo escrever algo como:
Antes deste JEP, no JDK12, o JEP 326: literais de cadeia bruta visava implementar um recurso semelhante, mas foi finalmente retirado.
fonte
Se você definir suas strings em um arquivo de propriedades, ficará muito pior. IIRC, será semelhante a:
Geralmente, é uma idéia razoável não incorporar grandes cadeias na origem. Convém carregá-los como recursos, talvez em XML ou em um formato de texto legível. Os arquivos de texto podem ser lidos em tempo de execução ou compilados na fonte Java. Se você acabar colocando-os na fonte, sugiro colocar o item
+
na frente e omitir novas linhas desnecessárias:Se você possui novas linhas, convém usar o método de junção ou formatação:
fonte
As vantagens são convertidas em StringBuilder.append, exceto quando as duas cadeias são constantes, para que o compilador possa combiná-las em tempo de compilação. Pelo menos, é assim no compilador da Sun, e eu suspeitaria mais, se não todos os outros compiladores fariam o mesmo.
Assim:
normalmente gera exatamente o mesmo código que:
Por outro lado:
é o mesmo que:
Ou seja, não há penalidade em quebrar seus literais de string em várias linhas com sinais de adição para facilitar a leitura.
fonte
No IntelliJ IDE, você só precisa digitar:
Posicione o cursor entre aspas e cole sua string. O IDE o expandirá em várias linhas concatenadas.
fonte
Infelizmente, o Java não possui literais de cadeia de várias linhas. Você precisa concatenar literais de sequência (usando + ou StringBuilder sendo as duas abordagens mais comuns para isso) ou ler a sequência em um arquivo separado.
Para literais de grandes cadeias de caracteres de várias linhas, eu estaria inclinado a usar um arquivo separado e a ler usando
getResourceAsStream()
(um método doClass
classe). Isso facilita a localização do arquivo, pois você não precisa se preocupar com o diretório atual e o local em que seu código foi instalado. Também facilita o empacotamento, porque você pode realmente armazenar o arquivo no seu arquivo jar.Suponha que você esteja em uma classe chamada Foo. Basta fazer algo assim:
O outro incômodo é que o Java não possui um método padrão "leia todo o texto deste Reader em uma String". É muito fácil escrever:
fonte
Mas, a melhor alternativa é usar String.format
fonte
Como o Java (ainda) não suporta nativamente seqüências de várias linhas, a única maneira, no momento, é contorná-lo usando uma das técnicas mencionadas acima. Criei o seguinte script Python usando alguns dos truques mencionados acima:
Coloque isso em um arquivo chamado javastringify.py e sua string em um arquivo mystring.txt e execute-o da seguinte maneira:
Você pode copiar a saída e colá-la no seu editor.
Modifique isso conforme necessário para lidar com casos especiais, mas isso funciona para minhas necessidades. Espero que isto ajude!
fonte
Você pode usar o código scala, que é compatível com java, e permite Strings de várias linhas incluídas em "" ":
(observe as aspas dentro da string) e de java:
Se isso é mais confortável ...?
Outra abordagem, se você costuma manipular texto longo, que deve ser colocado em seu código-fonte, pode ser um script, que pega o texto de um arquivo externo e o envolve como uma cadeia de linhas-java como esta:
para que você possa recortar e colar facilmente em sua fonte.
fonte
Você pode concatenar seus anexos em um método separado, como:
De qualquer forma, prefira
StringBuilder
a notação de mais.fonte
Na verdade, a seguir é a implementação mais limpa que vi até agora. Ele usa uma anotação para converter um comentário em uma variável de string ...
Portanto, o resultado final é que a variável html contém a cadeia de linhas múltiplas. Sem aspas, sem vantagens, sem vírgulas, apenas string pura.
Esta solução está disponível no seguinte URL ... http://www.adrianwalker.org/2011/12/java-multiline-string.html
Espero que ajude!
fonte
Consulte Java Stringfier . Transforma seu texto em um bloco java StringBuilder, escapando, se necessário.
fonte
fonte
Uma alternativa que ainda não vi como resposta é a
java.io.PrintWriter
.Além disso, o fato de
java.io.BufferedWriter
ter umnewLine()
método não é mencionado.fonte
Se você gosta da goiaba do google tanto quanto eu, ela pode fornecer uma representação bastante limpa e uma maneira fácil e agradável de não codificar também os caracteres da nova linha:
fonte
Use
Properties.loadFromXML(InputStream)
. Não há necessidade de bibliotecas externas.Melhor que um código confuso (como a manutenção e o design são sua preocupação), é preferível não usar seqüências longas.
Comece lendo as propriedades xml:
então você pode usar sua sequência multilinha de uma maneira mais sustentável ...
O MultiLine.xml` fica localizado na mesma pasta YourClass:
PS .: Você pode usar
<![CDATA["
..."]]>
para string semelhante a xml.fonte
Com o JDK / 12, versão 12 do acesso antecipado , agora é possível usar seqüências de múltiplas linhas em Java da seguinte maneira:
e isso resulta na seguinte saída:
Edit: Adiado para java 13
fonte
Uma solução bastante eficiente e independente da plataforma seria usar a propriedade do sistema para separadores de linha e a classe StringBuilder para criar cadeias:
fonte
Uma boa opção.
fonte
Java 13 e além
As cadeias de linhas múltiplas agora são suportadas em Java por meio de blocos de texto . Nos Java 13 e 14, esse recurso requer que você defina a
––enable–preview
opção ao criar e executar seu projeto. Confira esta documentação Java para obter mais detalhes.Agora, antes do Java 13, é assim que você escreveria uma consulta:
Graças ao Java 13 Text Blocks, você pode reescrever esta consulta da seguinte maneira:
Muito mais legível, certo?
Suporte IDE
O IntelliJ IDEA fornece suporte para transformar
String
blocos de concatenação herdados no novoString
formato de múltiplas linhas:JSON, HTML, XML
A multilinha
String
é especialmente útil ao escrever JSON, HTML ou XML.Considere este exemplo usando a
String
concatenação para criar um literal de string JSON:Você mal consegue ler o JSON devido aos caracteres de escape e à abundância de aspas duplas e sinais de adição.
Com os blocos de texto Java, o objeto JSON pode ser escrito assim:
Desde que usei o C # em 2004, estou querendo ter esse recurso em Java, e agora finalmente o temos.
fonte
Cadeias de linhas múltiplas não são permitidas em arquivos de propriedades. Você pode usar \ n nos arquivos de propriedades, mas não acho que seja uma solução muito boa no seu caso.
fonte
Eu sei que essa é uma pergunta antiga, no entanto, para desenvolvedores interessados, literais de várias linhas estarão em # Java12
http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html
fonte
Sugiro usar um utilitário, conforme sugerido por ThomasP, e depois vincular isso ao seu processo de compilação. Um arquivo externo ainda está presente para conter o texto, mas o arquivo não é lido no tempo de execução. O fluxo de trabalho é então:
class TextBlock {...
seguido por uma sequência estática gerada automaticamente a partir do arquivo de recursofonte
Quando uma série longa de + é usada, apenas um StringBuilder é criado, a menos que o String seja determinado no momento da compilação, caso em que nenhum StringBuilder é usado!
O único momento em que StringBuilder é mais eficiente é quando várias instruções são usadas para construir a String.
Nota: Apenas um StringBuilder é criado.
Deixe o mais claro e simples possível.
fonte