groovy - que - ¿Es posible crear un objeto sin declarar una clase?
miembros de una clase en programacion orientada a objetos (2)
¿Es posible crear un objeto sin declarar una clase? Al igual que en JavaScript obj = {a: ''1''}; console.log(obj.a)
obj = {a: ''1''}; console.log(obj.a)
En Groovy siempre debe proporcionar la clase de un objeto que se está creando, por lo que no hay equivalente en la sintaxis de objeto-literal de Groovy a JavaScript.
Sin embargo, Groovy tiene una sintaxis literal para un Map
, que es conceptualmente muy similar a un objeto de JavaScript, es decir, ambos son una colección de propiedades o pares de nombre-valor.
El código Groovy equivalente al JavaScript anterior es:
def obj = [a: ''1'']
println obj.a
Aunque no se utiliza ningún nombre de clase aquí, todavía está creando un objeto de una clase en particular ( java.util.LinkedHashMap
). El código anterior es solo una abreviatura de:
def obj = new LinkedHashMap();
obj.a = ''1''
println obj.a
La clase Expando
es quizás incluso más similar a un objeto JavaScript, y es útil cuando se quiere evitar la "sobrecarga" de definir una clase, o se desea un objeto dinámico al que se pueda agregar cualquier propiedad arbitraria en tiempo de ejecución.
Un poco sorprendido de que nadie haya mencionado la clase Expando. Esto agrega una funcionalidad extra sobre un mapa en el que puede hacer referencia directamente a las propiedades dentro de sus funciones. Ejemplo de código a continuación.
def expando = new Expando(a:"def")
expando.run = {def b ->
println("$a")
println("$b")
}
expando.run("ABC")
def map = [a:"def"]
map.run = {def b ->
println("$a") //THIS DOES NOT WORK. You will get a missing property exception.
println("$b")
}
map.run("ABC")
salida impresa:
def
A B C
groovy.lang.MissingPropertyException
ABC (si comenta la letra impresa ($ a) en map.run, println ($ b) imprime ABC)
Ignore los saltos de línea adicionales en la salida. Estaba pasando un buen rato poniendo def y ABC en líneas consecutivas.
editar: enlace Api