Equivalente Java das strings literais do C # com @

101

Pergunta rápida. Existe um equivalente de @ aplicado a strings em Java:

Por exemplo, posso fazer @"c:\afolder\afile"em C # e fazer com que ele ignore os caracteres de escape durante o processamento, em vez de ter que fazer "c:\\afolder\\aFile". Existe um equivalente em Java?

hmmm: stackoverflow está escapando para mim .. lol. O segundo exemplo deve ser:

c: (barra invertida dupla) uma pasta (barra invertida dupla) aArquivo

Simon Rigby
fonte
2
Possível duplicata de: stackoverflow.com/questions/2018556/…
codaddict de
2
Tomou a liberdade de esclarecer o título, pois @pode ser usado para usar palavras-chave do idioma também como identificadores.
Joey de
@unicornaddict - sim, de fato, é a mesma pergunta. Desculpas não vi isso ao pesquisar. @ Johannes - boa jogada .. obrigado
Simon Rigby,
Se você deseja fazer exatamente isso no Windows e usa o Windows XP ou mais recente (e deve!), Basta fazer File file = new File ("C: / afolder / afile"); Por outro lado, se você quiser ser mais portátil, deve dar uma olhada na excelente resposta do @CPerkins.
Haakon Løtveit
Observação (janeiro de 2018), literais de string brutos podem estar chegando para Java (JDK 10 ou mais): consulte Em Java, há uma maneira de escrever um literal de string sem ter que escapar das aspas? .
VonC

Respostas:

77

Não . Escapar / externalizar a string é sua única escolha.

Kent Boogaart
fonte
7
eu amo c # 6 com @ "string" e $ "string {i}" e muito futuros mais do que java
Guido Mocha
4
Vindo de C # para Java, muitas vezes é um passo abaixo em muitos aspectos
MikeKulls
33

Não, Java não tem literais de string textuais .

Se você deseja uma linguagem semelhante a Java (e baseada em Java-VM) que o faça , no entanto, você pode querer dar uma olhada no Groovy, que tem várias formas de literal de string .

Jon Skeet
fonte
O primeiro link (literais de string literalmente) aponta para links de "Documentação técnica retirada do Visual Studio 2003" groovy.codehaus.org quebrados
Vladas Maier,
1
@ace: Atualizado para o artigo "string" atual, que inclui uma seção sobre literais de string literalmente. Links Groovy também atualizados.
Jon Skeet,
16

Como Kent e Jon disseram, não, não há.

Estou respondendo apenas para apontar que mesmo que houvesse, para o seu caso em particular, seria uma má ideia no caso geral, supondo um programa mais do que pontual.

Os programas Java são executados em mais plataformas do que apenas Windows, e outras plataformas têm diferentes delimitadores de arquivo. Portanto, em vez de lidar com barras invertidas com escape, a maneira correta de lidar com seu exemplo específico é obtendo a propriedade do separador de arquivo:


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

Onde você teria criado ROOTDIR separadamente com base em alguma política - não apenas a plataforma, mas se você deseja que seu "arquivo" seja relativo à raiz do sistema de arquivos real ou ao diretório inicial do usuário.

Mas definitivamente, usar a propriedade de separador de arquivo torna seus programas mais amplamente utilizáveis. É mais trabalho? Sim. Como diz Wanda Sykes, "mas vale a pena".

CPerkins
fonte
1
Oi e obrigado. o fato de ser um 'nome do arquivo' no meu caso é meio irrelevante. Tudo o que meu código está fazendo é pegar uma string (ou tentar) e passá-la adiante. Na verdade, não faço nada com ele além de passá-lo para um serviço da web. Eu estava testando a resposta do serviço c # WCF sendo chamado de Java. Como eu estava apenas codificando um teste, foi nesse ponto que descobri essa limitação. Na verdade, não estou fazendo nada 'baseado em arquivo' com a string.
Simon Rigby,
2
As strings literal são ótimas para padrões regex.
Gordon Bean
12

Atualmente não é compatível com Java, mas pode estar disponível em versões futuras. Foi criado o JEP 326: Raw String Literals em 2018/01/23

Veja o progresso em https://bugs.openjdk.java.net/browse/JDK-8196004

Provavelmente algum dia você será capaz de fazer isso com:

`c:\afolder\afile`

ATUALIZAÇÃO: JEP proposto para descartar do JDK 12: 326: Literais de string brutos (visualização) Você pode ler a justificativa aqui: http://mail.openjdk.java.net/pipermail/jdk-dev/2018-December/002402.html

E mais detalhes aqui https://bugs.openjdk.java.net/browse/JDK-8215682

Resumindo : não haverá strings textuais em Java em um futuro próximo. E mesmo que apareça, não será ``.

Engilyin
fonte
1
Visto que esta é uma das discussões mais populares sobre o assunto, o JEP 326 foi retirado. A discussão foi reiniciada em janeiro de 2019 e agora é rastreada no JEP 355 para um lançamento JDK13.
NPras