Mon patron a dit que je devrais utiliser null == obj
, parce que c'est mieux que obj == null
, mais il ne s'est pas rappelé pourquoi. Existe-t-il une raison d'utiliser null == obj
?
Je le sens en quelque sorte… en face!
Après quelques recherches sur Google, la seule chose que j'ai trouvée est:
en C, cela vous empêche de taper accidentellement (obj = null) dans une structure conditionnelle.
Vous ne pouvez pas assigner accidentellement null
à obj
en tapant obj = null
à la place. Cependant, il s’agit d’une réminiscence des temps C, mais en Java, ce n’est pas possible, car l’expression =
renvoie le côté droit de l’affectation. Comme null
n'est pas une boolean
, le compilateur se plaindra.
J'essayais de l'expliquer à mon patron une fois, de le démontrer. S'il n'est toujours pas d'accord avec vous, faites-le. Se battre avec son patron est une chose mesquine.
Si vous compilez votre fichier avec if(null==obj)
, le code d'octet généré est if_acmpne
et, dans le cas de if(obj==null)
, il s'agit de ifnonnull
. Maintenant, dans if_acmpne
, deux opérandes sortent de la pile et sont cochés, ils ne sont pas égaux (dans ce cas, null
et obj
), et dans ifnonnull
, un seul opérande est affiché et vérifié s'il n'est pas nul. De ce fait, il semble que ifnonnull
soit meilleur, car il ne nécessite qu'un seul opérande.
Références: http://www.artima.com/underthehood/flowP.html
En Java, il n'y a pas de différence.
Je préfère (obj == null) car cela semble plus naturel.
Je n'ai jamais entendu parler de cela auparavant, mais il semble que le raisonnement que vous avez donné soit solide. Je pense aussi que ça a l'air d'être à l'envers, mais il ne devrait pas y avoir de problèmes autres que "se sentir" mal. Je ne pense pas que cela aurait des avantages en termes de performances ou quoi que ce soit du genre.
Si vous transmettez une condition telle que if (obj=null)
ou if (null=obj)
dans l'EDI Java actuel, elle sera mise en évidence comme une erreur de syntaxe. De plus, une tentative de compilation signalera l'erreur.
(obj==null)
et (null==obj)
sont acceptables, ils entraînent tous deux le même temps système, les derniers ne générant aucune performance. La décision d'utiliser l'un ou l'autre dépend du style de code adopté pour maintenir un style uniforme dans toutes les classes.
:)
Une chose que j’ai trouvée utile à ce propos est que la syntaxe ci-dessous (absolument valable pour mon POV) ne provoque pas d'avertissement spotbugs
'DC-DOUBLECHECK
, ce qui permet d'élever le seuil spotbugs
sans exclusion particulière, etc.
if (defaultClient == null) {
synchronized (DEFAULT_CLIENT_INIT_LOCK) {
if (null == defaultClient) {
...
}
}
}