Son but est d'avoir un objet null à la place qu'un mot-clé null
.
En Java normal null
est un mot-clé spécial qui signifie que la référence n'est attachée à aucun objet .. cela fonctionne bien mais ne gère pas les situations dans lesquelles vous essayez de faire quelque chose avec null référence.
Puisqu'un nul référence n'est pas un objet que vous ne pouvez rien faire et Java va lancer un NullPointerException
. Par contre si vous avez un NullObject
votre référence pointera vers celui-ci plutôt que vers rien .. bien sûr ce NullObject
ne peut rien faire, quand vous essayerez d'invoquer une méthode dessus rien ne se passera mais aucune exception sera jeté parce qu'alors NullObject
signifie "absence de tout objet" il est implémenté comme un objet avec la consé- quence évidente pour éviter ces situations.
Alors que groovy peut gérer des choses comme object?.methodName()
. Si l'objet est null groovy utilisera un NullObject
afin que cette vérification implicite fera quelque chose comme (peut-être ce n'est pas la mise en œuvre réelle, est juste pour vous donner l'idée)
if (object instanceof NullObject)
return new NullObject();
else
return object.someMethod();
En conclusion, il est nécessaire de surmonter le fait que l'utilisation d'une référence null en Java provoquera toujours un NullPointerException
.
Vous dites "quand vous essaierez d'invoquer une méthode, rien ne se passera mais aucune exception ne sera levée"; n'est pas une erreur logique silencieuse pire qu'une exception NullPointerException? – Pops
Non, ce n'est pas silencieux car vous utilisez explicitement la syntaxe __object? .method() __ juste à cet effet. En utilisant la syntaxe normale __object.method() __ lancerait une exception NullPointerException de toute façon, également avec le modèle nul. – Jack
Hm, j'ai besoin de regarder de plus près les différences entre Java et Groovy. Référence pour les futurs visiteurs de cette question: l'opérateur "?" est appelé l'opérateur de navigation sécurisée. http://groovy.codehaus.org/Statements#Statements-Safenavigation – Pops