Viniendo de Perl, estoy seguro de que me falta el medio "aquí documento" de crear una cadena de varias líneas en el código fuente:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
En Java, tengo que tener comillas engorrosas y signos más en cada línea mientras concateno mi cadena multilínea desde cero.
¿Cuáles son algunas mejores alternativas? ¿Definir mi cadena en un archivo de propiedades?
Editar : dos respuestas dicen que StringBuilder.append () es preferible a la notación más. ¿Alguien podría explicar por qué piensan eso? No me parece más preferible en absoluto. Estoy buscando una forma de evitar el hecho de que las cadenas multilínea no son una construcción de lenguaje de primera clase, lo que significa que definitivamente no quiero reemplazar una construcción de lenguaje de primera clase (concatenación de cadenas con más) con llamadas a métodos.
Editar : Para aclarar más mi pregunta, no me preocupa el rendimiento en absoluto. Me preocupan la mantenibilidad y los problemas de diseño.
string1 + string2
, está asignando un nuevo objeto de cadena y copiando los caracteres de ambas cadenas de entrada. Si agrega n cadenas juntas, estaría haciendo asignaciones n-1 y aproximadamente (n ^ 2) / 2 copias de caracteres. StringBuilder, por otro lado, copia y reasigna con menos frecuencia (aunque todavía hace ambas cosas cuando excede el tamaño de su búfer interno). Teóricamente, hay casos en los que el compilador podría convertir + para usar StringBuilder pero en la práctica quién sabe.Respuestas:
Stephen Colebourne ha creado una propuesta para agregar cadenas de varias líneas en Java 7.
Además, Groovy ya tiene soporte para cadenas de varias líneas .
fuente
Parece que quiere hacer un literal multilínea, que no existe en Java.
Su mejor alternativa serán las cadenas que están
+
juntas. Algunas otras opciones que la gente ha mencionado (StringBuilder, String.format, String.join) solo serían preferibles si comenzara con una serie de cadenas.Considera esto:
Versus
StringBuilder
:Versus
String.format()
:Versus Java8
String.join()
:Si desea que la nueva línea para su sistema particular, o hay que hacer uso
System.lineSeparator()
, o puede utilizar%n
enString.format
.Otra opción es colocar el recurso en un archivo de texto y simplemente leer el contenido de ese archivo. Esto sería preferible para cadenas muy grandes para evitar hinchar innecesariamente sus archivos de clase.
fuente
String.format
versión es que debe mantener el formato sincronizado con el número de líneas.En Eclipse, si activa la opción "Escape de texto al pegar en un literal de cadena" (en Preferencias> Java> Editor> Escritura) y pega una cadena de líneas múltiples dentro de comillas, se agregará automáticamente
"
y\n" +
para todas sus líneas.fuente
\r
s que Eclipse pone en Windows?Este es un hilo antiguo, pero una solución nueva y bastante elegante (con solo 4, quizás 3 pequeños inconvenientes) es usar una anotación personalizada.
Verificación: http://www.adrianwalker.org/2011/12/java-multiline-string.html
Un proyecto inspirado en ese trabajo está alojado en GitHub:
https://github.com/benelog/multiline
Ejemplo de código Java:
Los inconvenientes son
<%= variable %>
) :-)Y probablemente tenga que configurar Eclipse / Intellij-Idea para no reformatear automáticamente sus comentarios Javadoc.
Uno puede encontrar esto extraño (los comentarios Javadoc no están diseñados para incrustar nada más que comentarios), pero como esta falta de cadena multilínea en Java es realmente molesta al final, creo que esta es la peor solución.
fuente
Otra opción puede ser almacenar cadenas largas en un archivo externo y leer el archivo en una cadena.
fuente
@
sintaxis para C # es mucho más limpia.Esto es algo que nunca debes usar sin pensar en lo que está haciendo. Pero para guiones únicos, he usado esto con gran éxito:
Ejemplo:
Código:
fuente
String.join
Java 8 agregó un nuevo método estático al
java.lang.String
que ofrece una alternativa ligeramente mejor:String.join( CharSequence delimiter , CharSequence... elements )
Utilizándolo:
fuente
"\n"
se necesita manual , y es consciente de la portabilidad!JEP 355: Bloques de texto (Vista previa) tiene como objetivo cubrir esta funcionalidad, actualmente apunta a JDK 13 como una función de vista previa. Permitiendo escribir algo como:
Anterior a este JEP, en JDK12, JEP 326: Raw String Literals tenía como objetivo implementar una característica similar, pero finalmente se retiró.
fuente
Si define sus cadenas en un archivo de propiedades, se verá mucho peor. IIRC, se verá así:
En general, es una idea razonable no incrustar cadenas grandes en la fuente. Es posible que desee cargarlos como recursos, tal vez en XML o en un formato de texto legible. Los archivos de texto pueden leerse en tiempo de ejecución o compilarse en la fuente Java. Si terminas colocándolos en la fuente, sugiero poner el
+
el frente y omita nuevas líneas innecesarias:Si tiene nuevas líneas, es posible que desee un método de combinación o formato:
fuente
Las ventajas se convierten en StringBuilder.append, excepto cuando ambas cadenas son constantes para que el compilador pueda combinarlas en el momento de la compilación. Al menos, así es como está en el compilador de Sun, y sospecharía que la mayoría, si no todos los demás compiladores, harían lo mismo.
Entonces:
normalmente genera exactamente el mismo código que:
Por otra parte:
es lo mismo que:
Es decir, no hay penalización al dividir los literales de cadena en varias líneas con signos más de legibilidad.
fuente
En IntelliJ IDE solo necesita escribir:
Luego coloca el cursor dentro de las comillas y pega la cadena. El IDE lo expandirá en múltiples líneas concatenadas.
fuente
Lamentablemente, Java no tiene literales de cadena de varias líneas. Tiene que concatenar literales de cadena (usando + o StringBuilder son los dos enfoques más comunes para esto) o leer la cadena desde un archivo separado.
Para los literales de cadena de varias líneas grandes, me inclinaría a usar un archivo separado y leerlo usando
getResourceAsStream()
(un método deClass
clase). Esto facilita la búsqueda del archivo, ya que no tiene que preocuparse por el directorio actual en lugar de donde se instaló el código. También facilita el empaquetado, ya que en realidad puede almacenar el archivo en su archivo jar.Supongamos que estás en una clase llamada Foo. Solo haz algo como esto:
La otra molestia es que Java no tiene un método estándar para "leer todo el texto de este lector en una cadena". Sin embargo, es bastante fácil de escribir:
fuente
Pero, la mejor alternativa es usar String.format
fuente
Dado que Java (todavía) no admite nativamente cadenas de varias líneas, la única forma por ahora es piratearlo utilizando una de las técnicas mencionadas anteriormente. Creé el siguiente script de Python usando algunos de los trucos mencionados anteriormente:
Ponga eso en un archivo llamado javastringify.py y su cadena en un archivo mystring.txt y ejecútelo de la siguiente manera:
Luego puede copiar el resultado y pegarlo en su editor.
Modifique esto según sea necesario para manejar casos especiales, pero esto funciona para mis necesidades. ¡Espero que esto ayude!
fuente
Puede usar el código scala, que es compatible con java, y permite cadenas de líneas múltiples encerradas con "" ":
(tenga en cuenta las comillas dentro de la cadena) y de Java:
Si esto es más cómodo ...?
Otro enfoque, si a menudo maneja texto largo, que debe colocarse en su código fuente, podría ser un script, que toma el texto de un archivo externo y lo envuelve como una cadena-java multilínea como esta:
para que pueda cortarlo y pegarlo fácilmente en su fuente.
fuente
Puede concatenar sus anexos en un método separado como:
De cualquier manera, prefiera
StringBuilder
la notación más.fuente
En realidad, la siguiente es la implementación más limpia que he visto hasta ahora. Utiliza una anotación para convertir un comentario en una variable de cadena ...
Entonces, el resultado final es que la variable html contiene la cadena multilínea. Sin comillas, sin más, sin comas, solo cadena pura.
Esta solución está disponible en la siguiente URL ... http://www.adrianwalker.org/2011/12/java-multiline-string.html
¡Espero que ayude!
fuente
Ver Java Stringfier . Convierte su texto en un bloque Java StringBuilder que se escapa si es necesario.
fuente
fuente
Una alternativa que aún no he visto como respuesta es la
java.io.PrintWriter
.También el hecho de que
java.io.BufferedWriter
tiene unnewLine()
método no se menciona.fuente
Si te gusta la guayaba de Google tanto como a mí, puede darte una representación bastante limpia y una manera agradable y fácil de no codificar tus caracteres de nueva línea también:
fuente
Uso
Properties.loadFromXML(InputStream)
. No hay necesidad de libs externas.Mejor que un código desordenado (ya que la capacidad de mantenimiento y el diseño son su preocupación), es preferible no usar cadenas largas.
Comience leyendo las propiedades xml:
entonces puedes usar tu cadena multilínea de una manera más fácil de mantener ...
MultiLine.xml` se encuentra en la misma carpeta YourClass:
PD .: Puedes usar
<![CDATA["
..."]]>
para una cadena similar a xml.fuente
Con JDK / 12 acceso anticipado build # 12 , ahora se pueden usar cadenas multilínea en Java de la siguiente manera:
y esto da como resultado el siguiente resultado:
Editar: pospuesto a java 13
fuente
Una solución bastante eficiente e independiente de la plataforma sería usar la propiedad del sistema para los separadores de línea y la clase StringBuilder para construir cadenas:
fuente
Una buena opcion.
fuente
Java 13 y más allá
Las cadenas multilínea ahora son compatibles con Java a través de bloques de texto . En Java 13 y 14, esta característica requiere que establezca la
––enable–preview
opción al construir y ejecutar su proyecto. Consulte esta documentación de Java para obtener más detalles.Ahora, antes de Java 13, así es como escribiría una consulta:
Gracias a Java 13 Text Blocks, puede volver a escribir esta consulta de la siguiente manera:
Mucho más legible, ¿verdad?
Soporte IDE
IntelliJ IDEA proporciona soporte para transformar
String
bloques de concatenación heredados al nuevoString
formato multilínea :JSON, HTML, XML
La multilínea
String
es especialmente útil al escribir JSON, HTML o XML.Considere este ejemplo usando la
String
concatenación para construir un literal de cadena JSON:Apenas puede leer el JSON debido a los caracteres que se escapan y la abundancia de comillas dobles y signos más.
Con Java Text Blocks, el objeto JSON se puede escribir así:
Desde que usé C # en 2004, he querido tener esta característica en Java, y ahora finalmente la tenemos.
fuente
Las cadenas multilínea no están permitidas en los archivos de propiedades. Puede usar \ n en archivos de propiedades, pero no creo que sea una gran solución en su caso.
fuente
Sé que esta es una vieja pregunta, sin embargo, para los desarrolladores interesados, los literales de varias líneas estarán en # Java12
http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html
fuente
Sugiero usar una utilidad como lo sugiere ThomasP, y luego vincularla a su proceso de compilación. Todavía hay un archivo externo para contener el texto, pero el archivo no se lee en tiempo de ejecución. El flujo de trabajo es entonces:
class TextBlock {...
seguido de una cadena estática que se genera automáticamente a partir del archivo de recursosfuente
Cuando se usa una larga serie de +, solo se crea un StringBuilder, a menos que el String se determine en el momento de la compilación, en cuyo caso no se usa StringBuilder.
El único momento en que StringBuilder es más eficiente es cuando se utilizan varias instrucciones para construir la cadena.
Nota: Solo se crea un StringBuilder.
Hazlo lo más claro y simple que puedas.
fuente