StringUtils.EMPTY é recomendado?

91

Você usa em StringUtils.EMPTYvez de ""?

Quero dizer, tanto como um valor de retorno ou se você definir o valor de uma variável String. Não é para comparação, porque lá usamosStringUtils.isEmpty()

keuleJ
fonte

Respostas:

107

Claro que não. Você realmente acha que "" não é claro o suficiente?

As constantes têm essencialmente 3 casos de uso:

  1. Documente o significado de um valor (com nome constante + javadoc)
  2. Sincronize clientes em um valor comum.
  3. Fornece um atalho para um valor especial para evitar alguns custos de inicialização

Nenhum se aplica aqui.

David Pierre
fonte
33
Ainda vejo um caso de uso menor e raro StringUtils.EMPTY. Deixa claro que o uso da String vazia é intencional, e não algum tipo de preguiça ("Ah, isso requer uma String, vamos passar """). Se alguém acessar esse código, ele pensará duas vezes antes de fazer alterações. Além disso, se StringUtils.EMPTYfosse definida como sua própria variável, por exemplo MyClass.EMPTY, fazer alterações em "aquela representação do vazio" exigiria alterar uma linha de código. Você pode, por exemplo, alterá-lo para em "<empty>"vez da String vazia "". Mas, acho que isso está indo longe demais.
Timmos
5
Finalmente, tenho algum argumento sensato para encaminhar os fanáticos, em vez de pensar por conta própria o tempo todo. Obrigado.
Alex
2
Como o EMPTY não tem significado? EMPTY atende a 1 e 2 em sua lista. Os desenvolvedores experientes estão subestimando severamente o potencial dos desenvolvedores juniores de bagunçar algo tão simples quanto usar "".
Andrew T Finnell
4
@AndrewTFinnell o nome EMPTYnão tem nenhum significado que a própria string vazia já não tenha. Mais notavelmente, ele não documenta por que você decidiu usar uma string vazia naquele caso específico. Não é diferente nomear uma constante ONEe fingir que há um ponto em usar essa constante em vez do valor.
Holger
6
Votos negativos só porque, não, na verdade, não acho que "" seja claro o suficiente :( Está em branco? Está vazio? Há um espaço que não consigo ver porque o tamanho da minha fonte é pequeno? está vazio? Há algum caractere "invisível" estranho?
Dan Rayson
59

Eu uso StringUtils.EMPTY, para ocultar o literal e também para expressar que return StringUtils.EMPTYera totalmente esperado e que deveria retornar uma string vazia, ""pode levar à suposição de que ""pode ser facilmente transformado em outra coisa e que isso talvez tenha sido apenas um erro. Eu acho que o EMPTYé mais expressivo.

Christopher Klewes
fonte
37
De acordo com outros que sugeriram isso: você também usa ZERO para 0 e UM para 1?
Jon Skeet
9
Eu não compararia o caso especial 'vazio' ao uso do literal inteiro.
Christopher Klewes
16
Acho StringUtils.EMPTY menos expressivo do que "".
bacar
1
@JonSkeet Muito respeito a você. Eu sinto que você está incorreto aqui. Embora você e eu possamos nunca encontrar isso, há um caso a ser feito para não usar o literal "", pois ele não fornece verificação de sintaxe se um desenvolvedor bagunçar tudo. E sim, eu vi desenvolvedores juniores bagunçar coisas simples como "". Eu não acredito na idéia de mudar EMPTY para significar algo diferente de "". Gosto da ideia de EMPTY apenas pelo fato de o compilador ser capaz de entender seu significado.
Andrew T Finnell
@AndrewTFinnell: "Incorreto" é um termo estranho para o que certamente deve ser subjetivo. Não, não espero que EMPTY mude de significado, mas eu - como o bacar - acho ""que é mais expressivo do que usar StringUtils.EMPTY, e o que você disse não mudou minha opinião sobre isso. Posso quase acreditar que os desenvolvedores escreveram incorretamente um literal de string vazio muito, muito ocasionalmente - mas vou considerar a clareza do literal de string em relação ao que é uma vez em um milhão (e facilmente encontrado em testes, espero ... ) bug, pessoalmente.
Jon Skeet
29

Não, apenas use "".

O literal ""é claro como cristal. Não há mal-entendido quanto ao que foi feito. Eu não sei por que você precisa de uma constante de classe para isso. Só posso assumir que essa constante é usada em todo o pacote que contém, em StringUtilsvez de "". Isso não significa que você deva usá-lo.

Se houver uma pedra na calçada, você não precisa jogá-la.

Erick Robertson
fonte
6
"Se houver uma pedra na calçada, você não precisa jogá-la." Diga isso ao meu filho de 6 anos.
roel
14

Estou surpreso com quantas pessoas ficam felizes em presumir cegamente que "" é de fato uma string vazia e não contém (acidentalmente?) Nenhum dos maravilhosos caracteres invisíveis e sem espaçamento do Unicode. Pelo amor de tudo o que é bom e decente, use EMPTY sempre que puder.

j__m
fonte
4
Estou curioso - você já viu isso acontecer no código? Em caso afirmativo, foi acidental ou proposital? Pareceria difícil de fazer acidentalmente e, se propositalmente, eu poderia criar minha própria classe StringUtils com uma constante EMPTY não vazia e me referir a ela.
Ian Robertson
5
@IanRobertson Sim, eu vi isso acontecer. Muitas vezes, na verdade. As pessoas recortam e colam de sites o tempo todo e de um conjunto de códigos para outro. Existem também empresas que ainda usam Clear Case, que usa um conjunto de código arcaico, que é então traduzido cegamente para o conjunto ISO do Windows e é traduzido para UTF-8 se você mudar para Git. Passei incontáveis ​​horas consertando problemas de conjunto de códigos. Incluindo este.
Andrew T Finnell
3
@AndrewTFinnell Posso certamente ver como, em geral, isso pode causar problemas. Mas com que frequência você viu especificamente uma constante String de aparência vazia e não vazia?
Ian Robertson
13

Vou adicionar meus dois centavos aqui porque não vejo ninguém falando sobre Stringestagiário e inicialização de classe:

  • Todos os Stringliterais em fontes Java são internados, tornando todo "" e StringUtils.EMPTYo mesmo objeto
  • O uso StringUtils.EMPTY pode inicializar a StringUtilsclasse, pois acessa seu membro estático EMPTY apenas se não estiver declaradofinal (o JLS é específico nesse ponto). No entanto, é final, por isso não inicializará a classe.org.apache.commons.lang3.StringUtils.EMPTY

Veja uma resposta relacionada em String interning e em Class initialization , referindo-se ao JLS 12.4.1 .

Matthieu
fonte
“Somente se não for declarado final”, portanto, como este campo é declarado final, acessá-lo não pode causar a inicialização da StringUtilsclasse.
Holger
@Holger foi uma declaração geral, mas na verdade, eu editei com um link para o javadoc mostrando que é final (e, portanto, não inicializarei a classe).
Matthieu
8

Não gosto muito de usar, porque return "";é mais curto que return StringUtils.EMPTY.

No entanto, uma falsa vantagem de usá-lo é que se você digitar em return " ";vez de return "";, poderá encontrar um comportamento diferente (em relação ao teste correto de uma String vazia ou não).

Romain Linsolas
fonte
13
Você já observou que isso é realmente um problema (usando "" acidentalmente onde você quis dizer "")? Pessoalmente, acho o literal mais legível e nunca me causou problemas.
Jon Skeet
2
@Jon Não, de fato, mas tentei encontrar uma vantagem em usá-lo;)
Romain Linsolas
1
Não existe regra de tempo igual. Se não há vantagem, então não há vantagem.
Erick Robertson
1
Eu também não gosto "", odeio digitar a mesma string literal mais de uma vez, mesmo que apenas uma vez às vezes. Prefiro declarar constantes em Constants.java , mas não repeti-las em todos os lugares no código-fonte.
賈 可 Jacky
2
EU ACHO que return ""; é feio, PREFERO usar return StringUtil.EMPTY(declarado em minha própria classe StringUtil , NÃO StringUtils do Apache ).
賈 可 Jacky
5

Se sua classe não usa mais nada dos comuns, seria uma pena ter essa dependência apenas para esse valor mágico.

O designer dos StringUtils faz uso intenso dessa constante, e é a coisa certa a se fazer, mas isso não significa que você deve usá-la também.

Cherouvim
fonte
Eu quis dizer que é aceitável, já que o autor escolheu seguir esse caminho (evite qualquer uso de "valores mágicos"). Deve ser privado.
Cherouvim
O autor usa 0 com freqüência no código. Teria sido melhor para eles definir uma constante int ZERO = 0 também? Se não, qual é a diferença?
Jon Skeet
6
Depende do contexto. Se fosse um FCKEditorStringUtils, o EMPTY seria "<p> & nbsp </p>" e prefiro ver o EMPTY reutilizado em vez de replicar esse valor mágico em todos os lugares da classe. Portanto, por EMPTY, eles provavelmente significam EMPTY_CONTENT e não EMPTY_STRING (portanto, seu exemplo ZERO é um pouco injusto). Você não reutilizaria uma constante ERROR_VISA_INVALID = 0?
Cherouvim
1

Honestamente, não vejo muita utilidade em nenhum dos dois. Se você quiser comparar eg contra uma string vazia, basta usarStringUtils.isNotEmpty(..)

Bozho
fonte
2
StringUtils.isNotEmpty(..)também faz uma verificação nula, então não é exatamente o mesmo que comparar com uma string vazia.
Cherouvim
e como você vai campare null? como um segundo argumento de equals, mas o resultado será o mesmo -false
Bozho
isNotEmptyé o oposto de "".equals(…), portanto, o fato de que ele tratará nullcomo uma string vazia é diferente de comparar com uma string vazia, "".equals("")true, "".equals(null)false, StringUtils.isNotEmpty("")false, StringUtils.isNotEmpty(null)false. Se você apenas quer saber se uma string está vazia, use string.isEmpty(), que tem o comportamento correto de retornar trueiff for uma string vazia e lançar um NullPointerExceptionse a string for null...
Holger
1

Acho StringUtils.EMPTYútil em alguns casos para legibilidade. Particularmente com:

  1. Operador ternário, por exemplo.

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
  2. Retornando String vazia de um método, para confirmar que sim, eu realmente queria fazer isso.

Também usando uma constante, uma referência a StringUtils.EMPTYé criada. Caso contrário, se você tentar instanciar o literal String ""cada vez, a JVM terá que verificar se ele já existe no pool de String (o que provavelmente acontecerá, portanto, nenhuma sobrecarga de criação de instância extra). Certamente o uso StringUtils.EMPTYevita a necessidade de verificar o pool de String?

Tom
fonte
4
Seu argumento com as pesquisas múltiplas não se sustenta. No capítulo 13.4.9 da Java Language Specification 3.0, é mencionado que a StringUtils.EMPTYconstante é resolvida em tempo de compilação.
Roland Illig
4
A existência no conjunto de strings é verificada em tempo de compilação e tempo de carregamento de classe, não em tempo de execução sempre que você executa tal instrução,
Marquês de Lorne
1
Como StringUtil.EMPTYé uma constante de tempo de compilação, uma referência a ela é compilada exatamente no mesmo bytecode usado ""diretamente. Além disso, não vejo por que o operador ternário deveria fazer alguma diferença. É uma expressão como qualquer outra. Qualquer motivo para usar ou não uma constante nomeada também se aplica ao operador ternário.
Holger
1

Não, porque tenho mais a escrever. E um vazio String é plattform independente vazio (em Java).

File.separator é melhor que "/" ou "\".

Mas faça o que quiser. Você não pode obter um erro de digitação comoreturn " ";

Christian Kuetbach
fonte
7
Eu não entendo por que a maioria dos programadores tem tanto medo de escrever "demais". Ao escrever StringUtils.EMPTY, você obterá um código com comentários próprios, mais fácil de ler. E de acordo com Steve McConnell (ou algum estudo que ele citou no Code Complete 2.0) o código é lido 7 vezes mais do que é escrito.
Paweł Dyda
1
Você está particularmente certo, MAS: "" .equals (someString) é tão fácil de ler quanto StringUtils.EMPTY.equals (someString)
Christian Kuetbach
StringUtils.EMPTY.equals (someString) resultará em um erro de sintaxe se você escrevê-lo incorretamente. "" .equals (someString) não. Esta é a única razão pela qual é necessário usar EMPTY.
Andrew T Finnell
1
@AndrewTFinnell é por isso que programadores sãos escrevem em someString.isEmpty()vez disso.
Holger
-2

Sim, faz sentido. Pode não ser o único caminho a percorrer, mas vejo muito pouco na maneira de dizer que "não faz sentido".

Na minha opinião:

  • Ele se destaca mais do que "".
  • Isso explica que você quis dizer vazio, e esse espaço em branco provavelmente não funcionará.
  • Ainda será necessário mudar em todos os lugares se você não definir sua própria variável e usá-la em vários lugares.
  • Se você não permitir literais de string livres no código, isso ajuda.
Oron
fonte
It will still require changing everywhere if you don't define your own variable and use it in multiple places.você vai mudar uma string vazia para uma string vazia diferente?
Pita
@Pita Desculpe, foi uma frase ruim. Eu quis dizer que, se você usar este inline em vez de "", você ainda não obterá os mesmos benefícios de definir sua própria constante e reutilizá-la em vários lugares. Não é um argumento para StringUtils.EMPTY, é uma explicação que você não entende muito, mesmo que 'faça sentido'. Pessoalmente, eu criaria uma constante com um nome descritivo e então atribuiria isso. Já vi alguns casos em que um desenvolvedor pretendia um único espaço e acabou com uma string vazia, o que não acontece com esta forma.
Oron