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
.
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
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
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