Há benefícios para cada um e compreendo as diferenças, mas o que é considerado a melhor / prática padrão? E porque?
Por exemplo :
"myString".equals(myStringVar)
- Evita um NPE em potencial e não requer uma verificação nula. (Coisa boa?)
- Mais limpo para ler, pois uma verificação nula não é necessária.
- Se nulo não for um valor esperado, seu programa poderá estar sendo interrompido sem ser mais sábio.
Contudo
myStringVar.equals("myString")
- Requer uma verificação nula se nulo for um valor esperado. (Coisa boa?)
- Pode desordenar condicionais compostos com verificações nulas.
- Permite que o NPE informe se algo quebrou.
Qual variação é considerada o padrão a ser usado para Java e por quê?
java
programming-practices
coding-standards
BrandonV
fonte
fonte
Respostas:
Eu suspeito que isso se origine de uma precaução de segurança usada na programação em C (ou C ++) mais antigo. Em C, você poderia atribuir um valor acidentalmente quando pretender testar a igualdade:
Essa condição sempre será verdadeira, uma vez que é atribuída um valor x 3, não testando que x é igual a 3. Para evitar esses erros sutis, os desenvolvedores começaram a reverter a condição:
Ele contém o mesmo "bug", mas gera um erro do compilador, portanto é mais seguro.
Os idiomas mais modernos não têm esse problema e podem alertá-lo facilmente quando você tenta fazer esse tipo de coisa. Como tal, não é uma preferência muito pura; escolha uma e use-a de forma consistente.
fonte
equals
. Diferentemente de C, o problema para Java é que a expressãox.equals(y)
lançará um NPE quandox
for nulo. Se você possui um literal String"something"
e deseja considerar o casonull
como "diferente de", faz sentido escrever"something".equals(y)
se não souber sey
pode ser nulo. Isso nunca lançará um NPE.O padrão e as boas práticas variam de acordo com a cultura de uma organização para a qual você está trabalhando
Nosso padrão no .NET é
myStringVar == "myString"
simplesmente porque concordamos com isso, ou seja, acreditamos que seja limpo e concsiceNota: Isso não se aplica ao Java devido à
==
comparação das referências em vez dos próprios objetos. Em Java você deve estar usandomyStringVar.equals("myString")
.fonte
==
porque ele compara apenas referências de objetos. Dito isto, +1 para a convenção de acordos geralmente define a maneira "correta" de fazer as coisas.myStringVar == "myString"
é uma péssima idéia sobre Java (a menos que você tenha certeza absoluta de quemyStringVar
está internado).Acho que você está certo, pois depende da semântica de nulidade da variável. Se você não espera que ele seja nulo e não precisa verificar e manipulá-lo, o primeiro formulário é mais limpo.
Dito isto, em vez de incorporar a string literal, uma opção melhor provavelmente seria esta:
Especialmente se houver potencial para usar a string em mais de um local.
fonte