Usando ExpandoMetaClass
Como ya comenté, una de las cosas interesantes que veía en groovy era ExpandoMetaClass.
Este sería un ejemplo de uso, añadiendo a la clase StringBuilder un método en tiempo de ejecución. Es un método para que se hiciera el append sólo si el parámetro pasado no es nulo, de esta forma nos podríamos ahorrar una buena cantidad de if si necesitaramos hacer esta comprobación antes de cada append.
StringBuilder.metaClass.appendNotNull={ str ->
if(str){
append(str)
}
}
//Lo usaríamos como cualquier otro método
StringBuilder builder = new StringBuilder()
builder.appendNotNull("hola")
builder.appendNotNull(null)
builder.appendNotNull("mundo")
Este ejemplo es un poco trivial, ya que se podría hacer esto simplemente creando una clase que extendiera de StringBuilder e implementando el método. Aunque por otro lado, si sólo necesitamos hacerlo en un punto de nuestro código, esta podría ser una solución.
April 17th, 2008 at 3:03 pm
¿Se puede en groovy sobreescribir el propio método append guardando su funcionalidad? Vamos lo que se denomina normalmente un method chaining.
April 18th, 2008 at 6:46 pm
Hola Blaxter,
En teoría se pueden sobreescribir métodos, pero he hecho un par de pruebas y no lo he conseguido(soy algo torpe:P), por esto no puedo asegurarte nada sobre si puede modificarse un método manteniendo el comportamiento anterior, tampoco he visto documentación acerca de mantener el comportamiento existente… a ver si con más tiempo trato de ver si es posible.
Por cierto, el método append ya devuelve la instancia del mismo objeto, se podría hacer stringBuilder.append(”bla”).append(”bla”)
April 25th, 2008 at 6:57 am
Si utilizas ‘<<’ para agregar el método, se lanza una excepción de que el método ya existe.
Si lo haces como en el ejemplo de arriba, es decir:
String.metaClass.toLowerCase = { -> “prohibido minúsculas”}
cuando ejecutes “HOLA”.toLowerCase() verás que se ha reemplazado el método y ya no podrás convertir a minúsculas XD.
Pero también recuerda que un método se diferencia de otro por firma (nombre del método, número, tipo y orden de sus parámetros), así que puedes agregar muchas versiones de toLowerCase pero variando los parámetros.
Pueden revisar éste enlace donde se explica ésto: http://groovy.codehaus.org/ExpandoMetaClass+-+Methods
April 25th, 2008 at 3:04 pm
Hola Julio,
Ya tenía en cuenta eso, probablemente mi problema venía de estar ejecutando groovy desde eclipse y no lo probé en consola.
Era curioso ver que con StringBuilder.metaClass.append(…) no hacía nada y con StringBuilder.metaClass.append<<… saltaba la excepción que mencionas.
November 17th, 2008 at 1:30 am
StringBuilder, al igual que la mayoría de clases del JDK, son finales por lo que no se pueden extender, así que el uso de ExpandoMetaClass es realmente indispensable para hacer esta pequeñas grandes cosas que solo Groovy puede hacer
November 17th, 2008 at 2:03 am
Uh! Metedura de pata, se me pasó que era final
. Gracias Alberto.
La verdad que, estas “pequeñas” cosas que dan algunos lenguajes dinámicos, están muy bien tanto para este caso que es una clase final como para parchear alguna cosita de las librerías que usemos sin tener que tocar su código original