2010-03-19 6 views
6

J'ai utilisé Groovy pendant cinq heures et je suis tombé sur le Groovy NullObject. J'ai lu le Groovy explanation of the Null Object Pattern, mais il ne touche pas sur la classe NullObject directement; est NullObject simplement destiné à être une classe de base pour des choses comme NullTree et NullJob? Je reçois un NullObject de retour dans un code qui attend un String, et il provoque un échec un peu comme un "normal" null aurait.Quel est le but de la classe NullObject dans Groovy?

Alors, quel est le but de NullObject? Ou, formulé différemment, quelle valeur offre NullObject que «normal» null n'a pas?

Répondre

8

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.

+1

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

+0

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

+0

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