lunes, 3 de diciembre de 2012

Utilizando ExpandoMetaClass con Groovy




En el post anterior hablamos de categorías, ahora vamos a utilizar ExpandoMetaClass para agregar un método a una clase:

import org.apache.commons.lang.StringUtils

String.metaClass.capitalize = {
   StringUtils.capitalize(delegate)
}

assert "Groovy" == "groovy".capitalize()

Hemos agregado el método capitalize pero esto no es temporal como cuando usabamos "use". Este método va a quedar en la clase, dado que lo registramos. Con esta técnica se puede agregar métodos nuevos o sobrecargar métodos existentes.

ExpandoMetaClass incluye alguna extension / hooks que se puede utilizar para cambiar la forma en que se comporta una clase o un objeto, podemos hacer lo siguiente:

  • getProperty / setProperty: control de acceso
  • invokeMethod: podemos escribir este método y cada vez que necesite un método se va a llamar la función que necesitamos. Se puede implementar algo como AOP. 
  • methodMissing y propertyMissing: Podemos escribir escribir estos métodos para que se comporten de forma más amable.  


ExpandoMetaClass es una gran mejora sobre lo que ya ha proporcionaba Groovy pero también tiene sus peculiaridades, por ejemplo, la herencia no está activado por defecto (porque va a causar un impacto en el rendimiento)

Dejo link:
http://groovy.codehaus.org/ExpandoMetaClass