Java Language Pitfall - Utiliser la notation "Yoda" pour éviter une exception NullPointerException


Exemple

Un grand nombre d'exemples de code postés sur StackOverflow incluent des extraits comme ceci:

if ("A".equals(someString)) {
    // do something
}

Cela "empêche" ou "évite" une possible NullPointerException dans le cas où someString est null . En outre, il est discutable que

    "A".equals(someString)

est mieux que:

    someString != null && someString.equals("A")

(Il est plus concis et, dans certaines circonstances, il pourrait être plus efficace. Cependant, comme nous le soutenons plus loin, la concision pourrait être négative.)

Cependant, le véritable piège consiste à utiliser le test Yoda pour éviter les NullPointerExceptions .

Lorsque vous écrivez "A".equals(someString) vous "A".equals(someString) " le cas où someString est null . Mais comme un autre exemple ( Pitfall - "Faire de bonnes" nulls inattendus ) explique, "faire" null valeurs null peut être nocif pour diverses raisons.

Cela signifie que les conditions de Yoda ne sont pas les "meilleures pratiques" 1 . À moins que la valeur null soit attendue, il est préférable de laisser l' NullPointerException se produire pour obtenir un échec de test d'unité (ou un rapport de bogue). Cela vous permet de trouver et de corriger le bogue qui a provoqué l'apparition de la null inattendue / indésirable.

Les conditions Yoda ne doivent être utilisées que dans les cas où la valeur null est attendue car l'objet que vous testez provient d'une API documentée comme renvoyant une valeur null . Et sans doute, il serait préférable d'utiliser l'une des méthodes les moins jolies pour exprimer le test, car cela aide à mettre en évidence le test null pour quelqu'un qui examine votre code.


1 - Selon Wikipedia : "Les meilleures pratiques de codage sont un ensemble de règles informelles que la communauté du développement de logiciels a appris au fil du temps, ce qui peut aider à améliorer la qualité des logiciels." . Utiliser la notation Yoda ne permet pas d'atteindre cet objectif. Dans beaucoup de situations, cela aggrave le code.