Equivalente en Java de las cadenas textuales de C # con @

101

Pregunta rápida. ¿Existe un equivalente de @ aplicado a cadenas en Java?

Por ejemplo, puedo hacerlo @"c:\afolder\afile"en C # y hacer que ignore los caracteres de escape al procesar en lugar de tener que hacerlo "c:\\afolder\\aFile". ¿Existe un equivalente de Java?

hmmm: stackoverflow se me escapa .. lol. El segundo ejemplo debería decir:

c: (doble barra invertida) una carpeta (doble barra invertida) aFile

Simon Rigby
fuente
2
Posible duplicado de: stackoverflow.com/questions/2018556/…
codaddict
2
Se tomó la libertad de aclarar el título, ya que también @se puede usar para usar palabras clave del idioma como identificadores.
Joey
@unicornaddict - sí, de hecho, es la misma pregunta. Disculpas no vi eso al buscar. @ Johannes - buen movimiento .. gracias
Simon Rigby
Si desea hacer precisamente eso en Windows, y usa Windows XP o una versión más reciente (¡y debería hacerlo!), Puede simplemente hacer File file = new File ("C: / afolder / afile"); Por otro lado, si desea ser más portátil, debe mirar la excelente respuesta de @CPerkins.
Haakon Løtveit
Nota (enero de 2018), los literales de cadena sin formato podrían venir para Java (JDK 10 o más): consulte En Java, ¿hay alguna manera de escribir un literal de cadena sin tener que escapar de las comillas? .
VonC

Respuestas:

77

No se . Escapar / exteriorizar la cadena es su única opción.

Kent Boogaart
fuente
7
me encanta c # 6 con @ "string" y $ "string {i}" y muy futuros más que java
Guido Mocha
4
Viniendo de C # a Java, a menudo es un paso hacia abajo en muchos sentidos
MikeKulls
33

No, Java no tiene literales de cadena textuales .

Sin embargo, si desea un lenguaje similar a Java (y basado en Java-VM) que lo haga , es posible que desee ver Groovy, que tiene varias formas de literal de cadena .

Jon Skeet
fuente
El primer enlace (literales de cadena textual) apunta a "Visual Studio 2003 Retired Technical documentation" groovy.codehaus.org enlaces rotos
Vladas Maier
1
@ace: actualizado al artículo actual sobre "cadenas", que incluye una sección sobre literales de cadenas textuales. También se actualizaron los enlaces Groovy.
Jon Skeet
16

Como han dicho Kent y Jon, no, no lo hay.

Solo respondo para señalar que incluso si lo hubiera, para su caso particular, sería una mala idea en el caso general, asumiendo un programa más de una vez.

Los programas Java se ejecutan en más plataformas además de Windows, y otras plataformas tienen diferentes delimitadores de archivos. Entonces, en lugar de lidiar con barras invertidas de escape, la forma correcta de manejar su ejemplo particular es obteniendo la propiedad del separador de archivos:


    String sep = System.getProperty("file.separator");
    String filename = ROOTDIR + sep + "folder" + sep + "afile";

Donde habría creado ROOTDIR por separado basado en alguna política, no solo la plataforma, sino si desea que su "archivo" sea relativo a la raíz del sistema de archivos real, o relativo al directorio de inicio del usuario.

Pero definitivamente, usar la propiedad de separador de archivos hace que sus programas sean más utilizables. ¿Es más trabajo? Si. Como dice Wanda Sykes, "pero vale la pena".

CPerkins
fuente
1
Hola y gracias. el hecho de que sea un 'nombre de archivo' en mi caso es algo irrelevante. Todo lo que hace mi código es tomar una cadena (o intentarlo) y pasarla. En realidad, no hago nada con él más que pasarlo a un servicio web. Estaba probando la respuesta del servicio ac # WCF que se llama desde Java. Como estaba simplemente codificando una prueba, fue en este punto que descubrí esta limitación. En realidad, no estoy haciendo nada 'basado en archivos' con la cadena.
Simon Rigby
2
Las cadenas verbatim son excelentes para los patrones de expresiones regulares.
Gordon Bean
12

Actualmente no es compatible con Java, pero podría estar disponible en versiones futuras. Se creó JEP 326: Literales de cadena sin procesar en 2018/01/23

Ver el progreso en https://bugs.openjdk.java.net/browse/JDK-8196004

Probablemente algún día podrás hacerlo con:

`c:\afolder\afile`

ACTUALIZACIÓN: JEP propuso eliminar de JDK 12: 326: Literales de cadena sin formato (vista previa) Puede leer la justificación aquí: http://mail.openjdk.java.net/pipermail/jdk-dev/2018-December/002402.html

Y más detalles aquí https://bugs.openjdk.java.net/browse/JDK-8215682

La conclusión : no habrá cadenas textuales en Java en un futuro próximo. Y aunque parezca, más bien no será ''.

engilyin
fuente
1
Dado que esta es una de las discusiones más populares sobre el tema, JEP 326 ha sido retirado. La discusión se reinició en enero de 2019 y ahora se rastrea en JEP 355 para una versión JDK13.
NPras