Eu ouvi de alguém que null == object
é melhor do que object == null
verificar
por exemplo :
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
Existe alguma razão ou este é outro mito? Obrigado pela ajuda.
null
referências, o curso de ação padrão deve ser lançar um NPE. Algumas bibliotecas interessantes (como a biblioteca Java JDK7) têm um método semelhantepublic static <T> T notNull(T obj) { if (obj == null) { throw new NullPointerException(); } else { return obj; } }
. Há também@NonNull
(ou@Nonnull
?), Mas isso é "apagado".null == object
é conhecido como uma condição Yoda .Respostas:
Este é provavelmente um hábito aprendido com C, para evitar este tipo de erro de digitação (simples em
=
vez de duplo==
):A convenção de colocar a constante no lado esquerdo de
==
não é realmente útil em Java, pois Java requer que a expressão em umif
avalie umboolean
valor, então, a menos que a constante seja aboolean
, você obteria um erro de compilação de qualquer maneira que colocasse o argumentos. (e se for um booleano, você não deveria usar de==
qualquer maneira ...)fonte
x.booleanValue()
ou!x.booleanValue()
.x == true
oux == false
em uma expressão de condição é um cheiro ruim, IMHO.null == object
apenas para ter certeza de que não sobrescreveremos o objeto acidentalmente com um erro de digitação não deve ser um caso de uso. O que significa que estamos treinando para que agora que eu use "null" primeiro, tudo bem, mesmo que eu cometa um erro. Isso não significa que o código funcione conforme o esperado. Mesmo senull = object
for dado no lugar denull == object
, o programa não funcionará como esperado! Então não há sentido em seguir esta convenção!Como outros já disseram, é um hábito aprendido com C para evitar erros de digitação - embora mesmo em C eu esperasse compiladores decentes em níveis de aviso altos o suficiente para dar um aviso. Como diz Chandru, comparar com null em Java dessa forma só causaria problemas se você estivesse usando uma variável do tipo
Boolean
(que não está no código de amostra). Eu diria que é uma situação muito rara, e não uma para a qual vale a pena mudar a maneira como você escreve o código em qualquer outro lugar. (Eu não me incomodaria em reverter os operandos, mesmo neste caso; se estou pensando com clareza o suficiente para considerar revertê-los, tenho certeza de que posso contar os sinais de igual).O que não foi mencionado é que muitas pessoas (eu certamente incluído) acham o
if (variable == constant)
formulário mais legível - é uma forma mais natural de se expressar. Esta é uma razão para não copiar cegamente uma convenção de C. Você deve sempre questionar as práticas (como está fazendo aqui :) antes de presumir que o que pode ser útil em um ambiente é útil em outro.fonte
Isso não tem muito valor em Java (1.5+), exceto quando o tipo de objeto é
Boolean
. Nesse caso, isso ainda pode ser útil.if (object = null)
não causará falha de compilação em Java 1.5+ se o objeto for,Boolean
mas lançaria umNullPointerException
em tempo de execução.fonte
Em Java, não há um bom motivo.
Algumas outras respostas afirmam que é porque você pode acidentalmente fazer atribuição em vez de igualdade. Mas em Java, você precisa ter um booleano em um if, então este:
não vai compilar.
A única vez que isso pode importar em Java é se a variável for booleana:
fonte
== true
ou igualmente== true == true
.== true
. Mas eu vi tantos códigos ruins em minha carreira que não pergunto mais por que alguém escreveria algo e simplesmente aceito que algumas pessoas escreveram códigos desnecessários / questionáveis.x == true
como ruim porque poderia ser escrito por enganox = true
, não faria muito sentido alterá-lo para emtrue == x
vez de apenasx
.Isso também está intimamente relacionado a:
o que é conveniente se você não quiser lidar com NPEs:
fonte
int
ser um tipo primitivo é relevante, pois é impossível invocarequals
em umint
, portanto, não faz sentido discutir se usarx.equals(constant)
ouconstant.equals(x)
paraint
valores. E paraInteger
valores, o valor padrão é emnull
vez de0
.Este truque deveria evitar
v = null
tipos de erros de digitação.Mas o Java permite apenas expressões booleanas como
if()
condições, então esse truque não faz muito sentido, o compilador encontrará esses erros de digitação de qualquer maneira.No entanto, ainda é um truque valioso para código C / C ++.
fonte
Pelo mesmo motivo, você faz isso em C; atribuição é uma expressão, então você coloca o literal à esquerda para que não possa sobrescrevê-lo se acidentalmente usar em
=
vez de==
.fonte
x
é igual5
, ao digitar por enganoif (x = 5)
, ele compilará silenciosamente (e sempre avaliará comotrue
, independentemente do valor dex
). No entanto, se você adquirir o hábito de sempre especificar o literal primeiro: 'if (5 = x)', o compilador pode verificar novamente seu trabalho e poupar tempo batendo cabeça no depurador. Compiladores modernos tornam esse hábito desnecessário.obj
fosse do tipojava.lang.Boolean
(grande B), então poderia fazer a diferença (eu acho, não tentei realmente nem nada).Isso é para pessoas que preferem ter a constante do lado esquerdo. Na maioria dos casos, ter a constante no lado esquerdo impedirá que NullPointerException seja lançado (ou ter outro nullcheck). Por exemplo, o método String equals também faz uma verificação de nulos. Ter a constante à esquerda impedirá que você faça o cheque adicional. Que, de outra forma, também é realizado posteriormente. Ter o valor nulo à esquerda é apenas ser consistente.
gostar:
fonte
É a condição de Yoda, escrevendo de maneira diferente
Em java
condição yoda
fonte
Compare com o seguinte código:
Resultado (após várias execuções):
Portanto,
pingResult != null
é o vencedor.fonte
Por causa de sua propriedade comutativa , a única diferença entre
object == null
enull == object
(a versão Yoda ) é de natureza cognitiva : como o código é lido e digerido pelo leitor. Não sei a resposta definitiva, mas sei que pessoalmente prefiro comparar o objeto que estou inspecionando a outra coisa, em vez de comparar outra coisa ao objeto que estou inspecionando , se isso fizer algum sentido. Comece com o assunto e, em seguida, o valor com o qual compará-lo.Em alguns outros idiomas, esse estilo de comparação é mais útil.
Para se proteger contra a falta de um sinal "=" em geral, porém, acho que escrever
null == object
é um ato equivocado de programação defensiva . A melhor maneira de contornar esse código específico é garantir o comportamento com um teste junit. Lembre-se, o possível erro de perder um "=" não depende dos argumentos de entrada do método - você não depende do uso correto desta API por outras pessoas - então, um teste junit é perfeito para proteger contra isso. De qualquer forma, você desejará escrever testes junit para verificar o comportamento; um "=" ausente naturalmente está dentro do escopo.fonte