web-dev-qa-db-fra.com

Est-il possible de créer un objet sans déclarer la classe?

Est-il possible de créer un objet sans déclarer la classe? Comme en JavaScript obj = {a: '1'}; console.log(obj.a)

53
fedor.belov

Dans Groovy, vous devez toujours fournir la classe d'un objet en cours de création. Il n'y a donc pas d'équivalent dans Groovy à la syntaxe littérale-objet de JavaScript.

Cependant, Groovy a une syntaxe littérale pour Map, conceptuellement très similaire à un objet JavaScript, c’est-à-dire qu’il s’agit d’un ensemble de propriétés ou de paires nom-valeur.

Le code Groovy équivalent au JavaScript ci-dessus est:

def obj = [a: '1']
println obj.a

Même si aucun nom de classe n'est utilisé ici, vous créez toujours un objet d'une classe particulière (Java.util.LinkedHashMap). Le code ci-dessus n'est qu'un raccourci pour:

def obj = new LinkedHashMap();
obj.a = '1'
println obj.a

La classe Expando est peut-être encore plus similaire à un objet JavaScript et est utile lorsque vous souhaitez éviter le "surcoût" de la définition d'une classe ou que vous souhaitez un objet dynamique auquel toute propriété arbitraire peut être ajoutée au moment de l'exécution.

67
Dónal

Légèrement surpris que personne n'ait mentionné la classe Expando. Cela ajoute des fonctionnalités supplémentaires sur une carte dans la mesure où vous pouvez directement référencer des propriétés dans vos fonctions. Exemple de code ci-dessous.

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")

sortie imprimée:

def

Abc

groovy.lang.MissingPropertyException

ABC (si vous commentez le println ($ a) dans la map.run, println ($ b) imprime ABC)

Ignorer les sauts de ligne supplémentaires dans la sortie. Avait un sacré bout de temps mettant def et ABC sur des lignes consécutives.

Consultez la Documentation sur l'API Expando pour plus d'informations.

26
Joseph

Groovy a une notation équivalente pour JSON. La seule différence est qu'ils utilisent [:] pour les cartes au lieu de {}. Ainsi, vous pouvez clairement convertir un JSON en une notation d'objet groovy.

import groovy.json.JsonOutput

def obj = [:] //define map
obj.batsmen = [] //define array 
def b = [:] 
b.name= "V. Kohli"
b.score = 55
b.strike = false

obj.batsmen.Push(b)

//Push second object
obj.batsmen.Push(b)
println JsonOutput.toJson(obj)

Ici, je n'ai pas directement imprimé l'objet. Depuis il imprimera avec la notation d'accolades carrées 

Lire l'intégralité de l'article. Groovy pour les développeurs javascript . https://metamug.com/article/groovy-for-javascript-developers.php

1
Sorter