¿Es posible crear un objeto sin declarar la clase? Al igual que en JavaScript obj = {a: '1'}; console.log(obj.a)
¿Es posible crear un objeto sin declarar una clase?
Respuesta
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 Map
, que es conceptualmente muy similar a un objeto JavaScript, es decir, ambos son una colección de propiedades o pares nombre-valor.
El código Groovy equivalente al JavaScript anterior es:
def obj = [a: '1']
println obj.a
A pesar de que no hay ningún nombre de la clase usada aquí todavía se está creando un objeto de una clase particular (java.util.LinkedHashMap
). El código anterior es sólo la abreviatura de:
def obj = new LinkedHashMap();
obj.a = '1'
println obj.a
la Expando
class es quizás aún más similar a un objeto JavaScript, y es útil cuando se desea evitar la "sobrecarga" de la definición de una clase, o quiere un objeto dinámico a que cualquier propiedad arbitraria se puede agregar en tiempo de ejecución.
Ligeramente 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
ABC
groovy.lang.MissingPropertyException
ABC (si comentar el println ($ a) en el map.run , println ($ b) imprime ABC)
Ignora los saltos de línea adicionales en la salida. Estaba pasando un buen rato poniendo def y ABC en líneas consecutivas.
edición: Api enlace
¡Excelente descubrimiento! El ilustre señor Haki también ha escrito sobre la clase Expando: http://mrhaki.blogspot.com/2009/10/groovy-goodness-expando-as-dynamic-bean.html Diría que la clase Expando es en realidad la respuesta a lo que se estaba preguntando. – Henrik
- 1. ¿Es posible declarar una clase sin implementarla? (C++)
- 2. IllegalArgumentException: objeto no es una instancia de declarar clase
- 3. ¿Es posible recorrer un objeto Clase C#?
- 4. Crear un objeto sin llamar a una clase
- 5. ¿Es posible crear una instancia de un objeto en Java sin llamar al constructor?
- 6. ¿Es posible declarar una matriz como constante
- 7. ¿Es malo declarar una clase vacía?
- 8. ¿Es posible crear un objeto CLHeading en Objective C?
- 9. Cómo declarar un objeto en línea con las variables en línea sin una clase padre
- 10. En C++, ¿es posible reenviar declarar una clase como heredada de otra clase?
- 11. ¿Es posible cambiar la clase de un objeto Ruby?
- 12. ¿Es posible declarar un valor constante estático virtual en una clase de C++?
- 13. ¿Es posible crear una aplicación para iPhone sin productos Apple?
- 14. declarar propiedad como objeto?
- 15. ¿Es posible extender una clase sin constructores en Java?
- 16. ¿Es posible crear un global sin ámbito en application.cfc?
- 17. ¿Es posible pasar datos a EventArgs sin crear una clase derivada?
- 18. Llamar a una función del archivo de clase sin crear el objeto de esa clase
- 19. Instancia es un "objeto", pero la clase no es una subclase de "objeto": ¿cómo es esto posible?
- 20. ¿Es aceptable declarar una clase privada como un alias?
- 21. En PHP, ¿es posible crear una instancia de una clase sin llamar al constructor de la clase?
- 22. es posible crear una vista de administrador personalizada sin un modelo detrás de ella
- 23. Declarar una clase dentro de un módulo
- 24. ¿Hay alguna diferencia sustancial entre declarar una clase normalmente versus en un objeto de paquete?
- 25. ¿Es posible crear un lienzo transparente
- 26. Crear una instancia de un objeto de clase derivado, cuya clase base ctor es privada
- 27. Crear una clase sin método init (Objective-c)
- 28. ¿Es posible declarar una constante dinámica en VB .NET?
- 29. ¿Es posible filtrar un NSArray por clase?
- 30. ¿Es posible reenviar-declarar una función en Python?
también puede utilizar esta sintaxis para crear un mapa vacío: def obj = [:] – Hudson
interesante. En caso de que uno se pregunte, está permitido usar matrices/listas dentro de 'LinkedHashMap'. P.ej. esto funciona: 'def obj = [a: [1,2," foo "]]; obj.a.push ("bar") ' – Nux