2009-09-23 6 views
6

Auparavant, je pensais qu'une propriété dans Groovy est indiquée par l'omission d'un mot-clé de scoping. En d'autres termesDéfinition de la propriété Groovy

class Test { 
    def prop = "i am a property" 
    public notProp = "i am not" 
} 

Cependant, il semble que je me trompe à ce sujet, parce que les impressions de script suivant « getter val »

class Foo { 
    public bar = "init val" 

    public getBar() { 
    "getter val" 
    } 
} 

println new Foo().bar 

Le fait que le getter est invoqué lorsque bar est accessible suggère que bar est une propriété plutôt qu'un domaine. Alors, quelle est exactement la différence entre les champs et les propriétés dans Groovy.

Merci, Don

Répondre

3

Pour accéder à un champ directement devez préfixer avec un signe @:

assert "getter val" == new Foo().bar 
assert "init val" == new Foo()[email protected] 

Que la forme courte de new Foo().getBar() œuvres, bien que bar n'est pas une propriété, est toujours concis de mon point de vue.

En revanche, vous ne pouvez pas appeler foo.setBar("setter val"), mais vous pourriez avoir défini bar comme une propriété sans le modificateur d'accès.

1

L'utilisation d'un modificateur supprime en effet la création d'une propriété. Ce qui vous rend confus, c'est que . semble se replier sur un accès au champ lorsqu'une telle propriété n'existe pas.

 
$ groovysh 
Groovy Shell (2.1.0, JVM: 1.7.0_21) 
Type 'help' or '\h' for help. 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
groovy:000> class A { def a = "foo" }; 
===> true 
groovy:000> new A().getA() 
===> foo 
groovy:000> new A().a 
===> foo 
groovy:000> new A().properties 
===> {class=class A, a=foo} 

Mais:

 
groovy:000> class A { public def a = "foo" }; 
===> true 
groovy:000> new A().getA() 
ERROR groovy.lang.MissingMethodException: 
No signature of method: A.getA() is applicable for argument types:() values: [] 
Possible solutions: getAt(java.lang.String), grep(), grep(java.lang.Object), with(groovy.lang.Closure), putAt(java.lang.String, java.lang.Object), wait() 
     at groovysh_evaluate.run (groovysh_evaluate:2) 
     ... 
groovy:000> new A().a 
===> foo 
groovy:000> new A().properties 
===> {class=class A} 
0

Je pense que Metzendorf @ Christoph réponse était correcte ...

Pour accéder à un champ directement devez le préfixer avec un @ signe :

assert "getter val" == new Foo().bar 
assert "init val" == new Foo()[email protected] 

... mais j'ajouterais que dans votre exemple Foo votre méthode getBar a pris le pas sur la méthode getBar que Groovy a générée pour vous. Vous pouvez utiliser la syntaxe ci-dessus pour accéder à bar directement si vous souhaitez continuer à remplacer la méthode par défaut getBar Groovy générée pour vous, ou vous pouvez simplement ne pas surcharger getBar de sorte que tout appel à getBar utilisera le getter Groovy généré pour vous.

Questions connexes