2010-03-19 18 views
6

He estado usando Groovy durante las cinco horas y me he encontrado con Groovy NullObject. Leí el Groovy explanation of the Null Object Pattern, pero no toca la clase NullObject directamente; es NullObject simplemente destinado a ser una clase base para cosas como NullTree y NullJob? Recibo un NullObject en algún código que espera un String, y está causando una falla muy similar a la que tendría un null "normal".¿Cuál es el propósito de la clase NullObject en Groovy?

Entonces, ¿cuál es el propósito de NullObject? O, expresado de forma diferente, ¿qué valor ofrece NullObject que no es "normal" null?

Respuesta

8

Su propósito es tener un objeto nulo en lugar de una palabra clave null.

En Java normales null es una palabra clave especial que se utiliza en el sentido de que la referencia no está conectado a ningún objeto .. esto funciona bien, pero no se ocupa de las situaciones en las que se intenta hacer algo con un nulo de referencia.

Dado que nulo referencia no es un objeto no se puede hacer nada en él y Java lanzará un NullPointerException. Por el contrario, si tiene un NullObject su referencia apuntará a este en lugar de eso a nada ... por supuesto, este NullObject no puede hacer nada, cuando intente invocar un método en él no pasará nada, pero no será una excepción se lanzará porque aunque NullObject significa "ausencia de cualquier objeto" se implementa como un objeto con la obvia consecuencia de evitar estas situaciones.

Para que groovy pueda manejar cosas como object?.methodName(). Si el objeto es nula maravilloso utilizará un NullObject para que esta comprobación implícita va a hacer algo así (tal vez esta no es la aplicación real, es sólo para darle la idea)

if (object instanceof NullObject) 
    return new NullObject(); 
else 
    return object.someMethod(); 

En conclusión se necesita superar el hecho de que el uso de una referencia nula en Java siempre causará un NullPointerException.

+1

Usted dice "cuando intente invocar un método, nada sucederá pero no se lanzará ninguna excepción"; ¿no es un error lógico silencioso peor que una NullPointerException? – Pops

+0

No, no es silencioso porque utiliza explícitamente la sintaxis __object? .method() __ solo para este propósito. Usando la sintaxis normal __object.method() __ arrojaría una NullPointerException de todos modos, también con el patrón nulo. – Jack

+0

Hm, tengo que ver las diferencias entre Java y Groovy más de cerca, supongo. Referencia para futuros visitantes a esta pregunta: el operador "?." es nombrado operador de navegación segura. http://groovy.codehaus.org/Statements#Statements-Safenavigation – Pops

Cuestiones relacionadas