Entendo que toda vez que digito a string literal ""
, o mesmo objeto String é referenciado no pool de strings.
Mas por que a API String não inclui um public static final String Empty = "";
, para que eu pudesse usar referências String.Empty
?
Isso economizaria tempo de compilação, no mínimo, já que o compilador saberia fazer referência à String existente e não precisaria verificar se ele já havia sido criado para reutilização, certo? E, pessoalmente, acho que uma proliferação de literais de strings, especialmente pequenos, em muitos casos é um "cheiro de código".
Então havia um motivo de design grande por trás do String.Empty, ou os criadores de idiomas simplesmente não compartilharam minhas opiniões?
outputBlah = ""
, e provavelmente ele preferesomething == String.Empty
maissomething.Length > 0
bem (você pular um cheque nulo.)String.isEmpty()
função ... por que você querString.EMPTY
?String.isEmpty()
não retorna uma string vazia.Respostas:
String.EMPTY
tem 12 caracteres e""
dois, e ambos referenciam exatamente a mesma instância na memória em tempo de execução. Não sei ao certo porString.EMPTY
que economizaria tempo de compilação, na verdade acho que seria o último.Especialmente considerando que
String
s são imutáveis, não é como se você pudesse primeiro obter uma String vazia e executar algumas operações nela - melhor usar umaStringBuilder
(ouStringBuffer
se você quiser ser seguro para threads) e transformá-la em uma String.Atualização
Do seu comentário à pergunta:
Acredito que seria totalmente legítimo fornecer uma constante em sua classe apropriada:
E, em seguida, referenciá-lo como no seu código como
Dessa forma, pelo menos você está explícito que deseja uma String vazia, em vez de se esquecer de preencher a String no seu IDE ou algo semelhante.
fonte
StringBuilder
sem falar sobre como nove em cada dez vezes é totalmente inapropriado usar emStringBuilder
vez de concatenação.Usar
org.apache.commons.lang.StringUtils.EMPTY
fonte
""
... e a maioria provavelmente se oporia em voz alta ao uso,EMPTY
exceto em situaçõesEMPTY
específicas em que o significado é específico do domínio. (E, em tais casos, há provavelmente um nome mais apropriado.)Se você deseja comparar com uma sequência vazia sem se preocupar com valores nulos, faça o seguinte.
Por fim, você deve fazer o que acredita ser mais claro. A maioria dos programadores assume que "" significa string vazia, não uma string em que alguém esqueceu de colocar algo.
Se você acha que há uma vantagem de desempenho, deve testá-la. Se você não acha que vale a pena testar por si mesmo, é uma boa indicação de que realmente não vale a pena.
Parece que você tenta resolver um problema que foi resolvido quando o idioma foi projetado há mais de 15 anos.
fonte
if ("" == text)
if ("" == new String())
é falso. Um teste melhorif(text.isEmpty())
Se você realmente deseja uma constante String.EMPTY, pode criar uma classe final estática de utilitário chamada "Constants" (por exemplo) em seu projeto. Esta classe manterá suas constantes, incluindo a String vazia ...
Na mesma idéia, você pode criar constantes ZERO, ONE int ... que não existem na classe Integer, mas como eu comentei, seria uma pena escrever e ler:
Etc.
fonte
O Apache StringUtils também resolve esse problema.
Falhas nas outras opções:
O StringUtils concedido é outra biblioteca para arrastar, mas funciona muito bem e economiza muito tempo e verificação de problemas para obter valores nulos ou manipular NPEs normalmente.
fonte
"".equals(s)
:?Não basta dizer "o pool de memória de strings é reutilizado na forma literal, caso encerrado". O que os compiladores fazem sob o capô não é o ponto aqui. A pergunta é razoável, especialmente considerando o número de votos recebidos.
É sobre a simetria , sem ela as APIs são mais difíceis de usar para seres humanos. Os primeiros SDKs do Java ignoraram notoriamente a regra e agora é meio tarde demais. Aqui estão alguns exemplos em cima da minha cabeça, fique à vontade para usar seu exemplo "favorito":
fonte
Todos esses
""
literais são o mesmo objeto. Por que fazer toda essa complexidade extra? É apenas mais longo para digitar e menos claro (o custo para o compilador é mínimo). Como as seqüências de caracteres de Java são objetos imutáveis, nunca há necessidade de distinguir entre elas, exceto possivelmente como uma questão de eficiência, mas com a literal de seqüência de caracteres vazia, isso não é grande coisa.Se você realmente quer uma
EmptyString
constante, faça você mesmo. Mas tudo o que fará é incentivar um código ainda mais detalhado; haverá nunca mais ser qualquer benefício para fazê-lo.fonte
x = String.Empty
transmite intenção melhor quex = ""
. Este último pode ser uma omissão acidental. Dizer que nunca há nenhum benefício está incorreto.x = String.Empty
transmite intenção, é verdade. Mas suponha que a linguagem forneça uma constanteString.Empty
, quando você encontrar,x = ""
ainda saberá exatamente sobre a intenção como se não houvesse essa constante. Você precisaria garantir que todos os lugares no código Java do mundo em que uma string vazia fosse pretendida não usassem""
para obter o ganho de informação mencionado. Ironicamente, o C # usa uma constante e incentiva o seu uso, então, como eu disse, sei que é uma discussão muito opinativa.""
deve ser ilegal, para descartar acidentes. Estou brincando!Para adicionar o que Noel M afirmou, você pode examinar esta pergunta e esta resposta mostra que a constante é reutilizada.
http://forums.java.net/jive/message.jspa?messageID=17122
fonte
Entendo que toda vez que digito o literal String "", o mesmo objeto String é referenciado no pool String.
Não existe essa garantia. E você não pode contar com isso em seu aplicativo, é completamente uma decisão da jvm.
ou os criadores do idioma simplesmente não compartilharam minhas opiniões?
Sim. Para mim, parece coisa de prioridade muito baixa.
fonte
String username = "Bob" + " " + "Smith";
). As seqüências criadas programaticamente não têm garantias de serem internadas, a menos que você chame explicitamenteintern()
como afirmou. O cenário do OP descreve o uso da literal""
em branco da cadeia de caracteres em todo o código, que é um caso em que a internação automática ocorreria.String a = ""; for(int i = 0; i < 100; i++) {a += "a";} String b = ""; for(int i = 0; i < 100; i++) {b += "b";} a.intern(); b.intern();
Agora oa
eb
apontam para o mesmo local de memória em PermGen. Veja este artigoResposta tardia, mas acho que acrescenta algo novo a esse tópico.
Nenhuma das respostas anteriores respondeu à pergunta original. Alguns tentaram justificar a falta de uma constante, enquanto outros mostraram maneiras pelas quais podemos lidar com a falta da constante. Mas ninguém forneceu uma justificativa convincente para o benefício da constante; portanto, sua falta ainda não é explicada adequadamente.
Uma constante seria útil porque impediria que certos erros de código passassem despercebidos.
Digamos que você tenha uma grande base de código com centenas de referências a "". Alguém modifica um deles enquanto percorre o código e o altera para "". Essa mudança teria uma grande chance de passar despercebida para a produção; nesse momento, poderá causar algum problema cuja fonte será difícil de detectar.
OTOH, uma constante de biblioteca denominada EMPTY, se sujeita ao mesmo erro, geraria um erro de compilador para algo como EM PTY.
Definir sua própria constante ainda é melhor. Alguém ainda pode alterar sua inicialização por engano, mas devido ao seu amplo uso, o impacto de um erro desse tipo seria muito mais difícil de passar despercebido do que um erro em um único caso de uso.
Esse é um dos benefícios gerais que você obtém ao usar constantes em vez de valores literais. As pessoas geralmente reconhecem que usar uma constante para um valor usado em dezenas de lugares permite que você atualize facilmente esse valor em apenas um lugar. O que é menos frequentemente reconhecido é que isso também impede que esse valor seja acidentalmente modificado, porque essa alteração seria exibida em todos os lugares. Portanto, sim, "" é menor que VAZIO, mas VAZIO é mais seguro de usar que "".
Portanto, voltando à pergunta original, podemos apenas especular que os projetistas de linguagem provavelmente não estavam cientes desse benefício de fornecer constantes para valores literais que são freqüentemente usados. Felizmente, um dia veremos constantes de string adicionadas em Java.
fonte
Para aqueles que reivindicam
""
eString.Empty
são intercambiáveis ou""
melhor, você está muito errado.Cada vez que você faz algo como myVariable = ""; você está criando uma instância de um objeto. Se o objeto String do Java tivesse uma constante pública VAZIA, haveria apenas 1 instância do objeto ""
Por exemplo: -
10 (11 incluindo String.EMPTY) ponteiros para 1 objeto
Ou: -
10 ponteiros para 10 objetos
Isso é ineficiente e, em um aplicativo grande, pode ser significativo.
Talvez o compilador Java ou o tempo de execução seja eficiente o suficiente para apontar automaticamente todas as "" instâncias para a mesma instância, mas pode não ser necessário e requer processamento adicional para fazer essa determinação.
fonte
if (text == "")