web-dev-qa-db-fra.com

(obj == null) vs (null == obj)?

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.

38
Luke Vo

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.

34
Femaref

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

15
Mohammad Suhaib

En Java, il n'y a pas de différence. 

Je préfère (obj == null) car cela semble plus naturel. 

11
Olle Hallin

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. 

1
Paul

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.

1
Bitmap

:)

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) {
            ...
        }
    }
}
0
GullerYA