ejemplos - groovy vs java
Agregue dinámicamente una propiedad o método a un objeto en groovy (1)
Si solo desea agregar el método bye()
a la única instancia g
de la clase Greet
, debe hacer:
g.metaClass.bye = { println "Goodbye, $name" }
g.bye()
De lo contrario, para agregar bye()
a todas las instancias de Greet
(a partir de ahora), llame
Greet.metaClass.bye = { println "Goodbye, $name" }
Pero tendrías que hacer esto antes de crear una instancia de la clase Greet
Aquí hay una página sobre la metaClass por instancia
Y aquí está la página de MetaClasses en general
Además, hay un error en tu constructor. Te estás perdiendo who
de enfrente de tu [1..-1]
y si al constructor se le pasa una String
de menos de 2 caracteres de longitud, lanzará una excepción
Una mejor versión podría ser:
Greet( String who ) {
name = who.inject( '''' ) { String s, String c ->
s += s ? c.toLowerCase() : c.toUpperCase()
}
}
Como se mencionó en los comentarios,
Greet( String who ) {
name = who.capitalize()
}
es la forma correcta
¿Es posible agregar una propiedad o un método a un objeto dinámicamente en Groovy? Esto es lo que he intentado hasta ahora:
class Greet {
def name
Greet(who) { name = who[0].toUpperCase() + [1..-1] }
def salute() { println "Hello $name!" }
}
g = new Greet(''world'') // create object
g.salute() // Output "Hello World!"
g.bye = { println "Goodbye, $name" }
g.bye()
Pero obtengo la siguiente excepción:
Hello World!
Caught: groovy.lang.MissingPropertyException: No such property: bye for class: Greet
Possible solutions: name
at test.run(greet.groovy:11)