2009-03-08 18 views
6

En C#, si quieres que una cadena se toma literalmente, es decir, ignorar caracteres de escape, que puede utilizar:¿Por qué Java no tiene una forma de especificar los literales de cadenas sin espaciar?

string myString = @"sadasd/asdaljsdl"; 

Sin embargo no existe un equivalente en Java. ¿Hay alguna razón por la cual Java no haya incluido algo similar?

Editar:

Después de revisar algunas respuestas y pensar en ello, lo que realmente te pido es:
¿Hay algún argumento convincente en contra de añadir a esta sintaxis de Java? ¿Algo negativo, que simplemente no estoy viendo?

Respuesta

5

Java siempre me ha parecido un lenguaje minimalista. Me imagino que, dado que las cadenas verbatim no son una necesidad (como las propiedades, por ejemplo), no estaban incluidas.

Por ejemplo, en C# hay muchas maneras rápidas de hacer algo como propiedades:

public int Foo { get; set; } 

y literales cadenas:

String bar = @"some 
string"; 

Java tiende a evitar tanto la sintaxis de azúcar como sea posible. Si quieres captadores y definidores para un campo que debe hacer esto:

private int foo; 

public int getFoo() { return this.foo; } 
public int setFoo(int foo) { this.foo = foo; } 

y cuerdas debe ser escapado:

String bar = "some\nstring"; 

creo que es debido a que en muchos sentidos C# y Java tienen un diseño diferente metas. C# se desarrolla rápidamente con muchas características que se agregan constantemente, pero la mayoría de las cuales tienden a ser azúcar sintaxis. Java, por otro lado, se trata de simplicidad y facilidad de comprensión. Muchas de las razones por las que se creó Java en primer lugar fueron reacciones contra la complejidad de la sintaxis de C++.

+1

Java 7 tendrá propiedades también :) –

+1

Es un poco difícil de caracterizar un lenguaje donde se puede escribir "nuevo HashMap

+4

Je, Java es única "minimalista" en un sentido muy específico. Veo lo que quieres decir, y estoy de acuerdo. Pero al mismo tiempo, también es un lenguaje increíblemente grande e hinchado, tratando de ser todo para todos. :) Pero sí, parece que a Java no le gustan los accesos directos. – jalf

2

Me resulta gracioso "por qué" preguntas. C# es un lenguaje más nuevo e intenta mejorar lo que se considera deficiencias en otros lenguajes como Java. El motivo simple de la pregunta "por qué" es: el estándar Java no define el operador @ como en C#.

+0

Solo un pequeño detalle: @ no es un operador. Es solo parte de la sintaxis de una literal literaria literal. –

+0

Gracias por la aclaración, Jon. –

+0

C++ es incluso más antiguo que Java, pero admite literalmente cadenas crudas hace mucho tiempo. La especificación de Java también se actualiza, pero todavía está lejos de otros lenguajes, incluso después de las actualizaciones –

0

Creo que esta pregunta es como: "¿Por qué Java no es sensible a la indentación como Python?" La sintaxis mencionada es un azúcar, pero es redundante (superflua).

+0

, no solo el azúcar, sino que también mejora enormemente la legibilidad –

1

Creo que una de las razones es que las expresiones regulares (que son una razón importante para este tipo de literales String) no forman parte de la plataforma Java hasta Java 1.4 (si no recuerdo mal). Simplemente no había tanta necesidad de esto, cuando el lenguaje estaba definido.

+0

OTOH, el SQL en línea era más común en los viejos tiempos. –

+0

@Tom: sí, pero alentar los ataques de inyección SQL no era prioritario en la lista de prioridades ;-) Las declaraciones preparadas no tienen un problema con el escape. –

0

No estoy seguro del por qué, pero puede hacerlo escapando del carácter de escape. Como todos los caracteres de escape van precedidos de una barra invertida, al insertar una barra diagonal inversa puede cancelar el carácter de escape. p.ej. "\ now" producirá una línea nueva y luego las letras "ow" pero "\ now" producirá "\ now"

+0

¿Has leído la pregunta? –

0

Debería encontrar que su IDE maneja el problema por usted. Si se encuentra en medio de un String y copia y pega un texto sin formato, debería escaparse del texto.

PERL tiene una variedad más amplia de maneras de establecer literales String y, a veces, también desea que Java las admita.;)

+1

Fuera de tema: es Perl, no PERL. – nxadm

2

Como dije, la mayoría de las veces cuando quieres escapar de los personajes es para expresiones regulares. En ese caso de uso: Pattern.quote()

1

Java (por desgracia) no tiene nada como esto, pero Groovy does:

assert '''hello, 
world''' == 'hello,\nworld' 
//triple-quotes for multi-line strings, adds '\n' regardless of host system 
assert 'hello, \ 
world' == 'hello, world' //backslash joins lines within string 

Me gustó mucho esta característica de C# atrás cuando hice un trabajo .NET. Fue especialmente útil para las consultas SQL cortadas y pegadas.

+0

Esto es lo que estaba buscando. Pero el OP pregunta acerca de los personajes de escape; Groovy ignora a aquellos con cuerdas rayadas, no con comillas triples. – Noumenon

Cuestiones relacionadas