J'ai entendu quelqu'un qui null == object
vaut mieux que object == null
vérifier
par exemple :
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
Y a-t-il des raisons ou est-ce un autre mythe? Merci pour l'aide.
null
références, la marche à suivre par défaut devrait être de lancer un NPE. Certaines bibliothèques intéressantes (comme la bibliothèque Java JDK7) ont une méthode quelque chose commepublic static <T> T notNull(T obj) { if (obj == null) { throw new NullPointerException(); } else { return obj; } }
. Il y a aussi@NonNull
(ou@Nonnull
?), Mais cela est "effacé".null == object
est connue comme une condition Yoda .Réponses:
C'est probablement une habitude apprise de C, pour éviter ce genre de faute de frappe (simple
=
au lieu d'un double==
):La convention consistant à placer la constante sur le côté gauche de
==
n'est pas vraiment utile en Java car Java nécessite que l'expression dans unif
évalue à uneboolean
valeur, donc à moins que la constante ne soit aboolean
, vous obtiendriez une erreur de compilation de toute façon arguments. (et si c'est un booléen, vous ne devriez pas utiliser de==
toute façon ...)la source
x.booleanValue()
ou!x.booleanValue()
.x == true
oux == false
dans une expression de condition est une mauvaise odeur, à mon humble avis.null == object
juste pour s'assurer que nous n'écrasons pas accidentellement un objet avec une faute de frappe ne devrait pas du tout être un cas d'utilisation. Ce qui veut dire que, nous nous entraînons à ce que maintenant que j'utilise d'abord "null", ça va, même si je fais une erreur. Cela ne signifie pas que le code fonctionne comme prévu. Même s'ilnull = object
est donné à la place denull == object
, le programme ne fonctionnera pas comme prévu! Alors ça ne sert à rien de suivre cette convention!Comme d'autres l'ont dit, c'est une habitude apprise de C pour éviter les fautes de frappe - même si même en C, je m'attendrais à des compilateurs décents à des niveaux d'avertissement suffisamment élevés pour donner un avertissement. Comme le dit Chandru, comparer avec null en Java de cette manière ne poserait des problèmes que si vous utilisiez une variable de type
Boolean
(que vous n'êtes pas dans l'exemple de code). Je dirais que c'est une situation assez rare, et pas une pour laquelle il vaut la peine de changer la façon dont vous écrivez du code partout ailleurs. (Je ne prendrais pas la peine d'inverser les opérandes même dans ce cas; si je réfléchis suffisamment clairement pour envisager de les inverser, je suis sûr que je peux compter les signes égaux.)Ce qui n'a pas été mentionné, c'est que beaucoup de gens (moi y compris certainement) trouvent que le
if (variable == constant)
formulaire est plus lisible - c'est une façon plus naturelle de s'exprimer. C'est une raison pour ne pas copier aveuglément une convention de C. Vous devriez toujours remettre en question les pratiques (comme vous le faites ici :) avant de supposer que ce qui peut être utile dans un environnement l'est dans un autre.la source
Cela n'a pas beaucoup de valeur en Java (1.5+) sauf lorsque le type d'objet l'est
Boolean
. Dans ce cas, cela peut toujours être pratique.if (object = null)
n'entraînera pas d'échec de compilation dans Java 1.5+ si l'objet estBoolean
mais lèverait unNullPointerException
à l'exécution.la source
En Java, il n'y a pas de bonne raison.
Quelques autres réponses ont affirmé que c'est parce que vous pouvez accidentellement en faire une affectation au lieu de l'égalité. Mais en Java, vous devez avoir un booléen dans un if, donc ceci:
ne compilera pas.
Le seul moment où cela pourrait avoir une importance en Java est si la variable est booléenne:
la source
== true
ou également== true == true
.== true
. Mais j'ai vu tellement de mauvais codes dans ma carrière que je ne demande plus pourquoi quelqu'un écrirait quelque chose et accepterait simplement que certaines personnes aient écrit du code inutile / discutable.x == true
comme mauvais parce qu'il pourrait être écrit par erreurx = true
, il n'y aurait pas beaucoup de sens à le changer entrue == x
plutôt que simplementx
.Ceci est également étroitement lié à:
ce qui est pratique si vous ne voulez pas traiter avec des NPE:
la source
int
un type primitif est pertinent, car il est impossible d'invoquerequals
sur unint
, par conséquent, il est inutile de discuter de l'utilisationx.equals(constant)
ouconstant.equals(x)
desint
valeurs. Et pour lesInteger
valeurs, la valeur par défaut estnull
plutôt que0
.Cette astuce est censée éviter les
v = null
types de fautes de frappe.Mais Java n'autorise que les expressions booléennes comme
if()
conditions de sorte que cette astuce n'a pas beaucoup de sens, le compilateur trouvera quand même ces fautes de frappe.C'est toujours une astuce précieuse pour le code C / C ++.
la source
Pour la même raison, vous le faites en C; affectation est une expression, vous mettez donc le littéral à gauche pour ne pas pouvoir l'écraser si vous l'utilisez accidentellement à la
=
place de==
.la source
x
égal à égal5
, lorsque vous tapez par erreurif (x = 5)
, il se compilera silencieusement (et évaluera toujourstrue
, quelle que soit la valeur dex
). Cependant, si vous prenez l'habitude de toujours spécifier d'abord le littéral: 'if (5 = x)', le compilateur peut vérifier votre travail et vous faire gagner du temps dans le débogueur. Les compilateurs modernes rendent cette habitude inutile.obj
c'était de typejava.lang.Boolean
(gros B), alors ça pourrait faire une différence (je pense, pas vraiment essayé ou quoi que ce soit).C'est pour les personnes qui préfèrent avoir la constante sur le côté gauche. Dans la plupart des cas, avoir la constante sur le côté gauche empêchera NullPointerException d'être levée (ou d'avoir un autre contrôle nul). Par exemple, la méthode String equals effectue également une vérification nulle. Avoir la constante à gauche vous empêchera d'écrire le chèque supplémentaire. Ce qui, d'une autre manière, est également effectué plus tard. Avoir la valeur nulle sur la gauche est juste cohérent.
comme:
la source
C'est la condition Yoda qui écrit de manière différente
En java
état de Yoda
la source
Comparez avec le code suivant:
Sortie (après plusieurs exécutions):
Par conséquent,
pingResult != null
est le gagnant.la source
En raison de sa propriété commutative , la seule différence entre
object == null
etnull == object
(la version Yoda ) est de nature cognitive : comment le code est lu et digéré par le lecteur. Je ne connais pas la réponse définitive, mais je sais que je préfère personnellement comparer l'objet que j'inspecte à autre chose, plutôt que de comparer autre chose à l'objet que j'inspecte , si cela a un sens. Commencez par le sujet, puis la valeur à laquelle le comparer.Dans certaines autres langues, ce style de comparaison est plus utile.
Pour se prémunir contre un signe "=" manquant en général, je pense que l'écriture
null == object
est un acte malavisé de programmation défensive . La meilleure façon de contourner ce code particulier est de garantir le comportement avec un test junit. N'oubliez pas que l'erreur possible de manquer un "=" ne dépend pas des arguments d'entrée de la méthode - vous n'êtes pas dépendant de la bonne utilisation de cette API par d'autres personnes - donc un test junit est parfait pour se prémunir contre cela. Quoi qu'il en soit, vous voudrez écrire des tests junit pour vérifier le comportement; un "=" manquant entre naturellement dans le champ d'application.la source