2009-09-23 8 views
6

In precedenza avevo pensato che una proprietà in Groovy è indicata dall'omissione di una parola chiave dell'ambito. In altre paroledefinizione proprietà Groovy

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

Tuttavia, sembra che sono errato su questo, perché i seguenti script stampa "getter val"

class Foo { 
    public bar = "init val" 

    public getBar() { 
    "getter val" 
    } 
} 

println new Foo().bar 

Il fatto che il getter viene richiamato quando si accede bar suggerisce che bar è una proprietà piuttosto che un campo. Quindi, qual è esattamente la differenza tra i campi e le proprietà in Groovy.

Grazie, Don

risposta

3

Per poter accedere a un campo direttamente bisogna anteporre con un segno @:

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

Che la forma abbreviata di new Foo().getBar() opere, anche se bar non è una proprietà, è ancora conciso dal mio punto di vista.

Al contrario non è possibile effettuare una chiamata a foo.setBar("setter val"), ma si potrebbe in caso si definisse bar come una proprietà senza il modificatore di accesso.

1

L'utilizzo di un modificatore elimina effettivamente la creazione di una proprietà. Ciò che ti confonde è che . sembra fallback su un accesso al campo quando non esiste una tale proprietà.

 
$ 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} 

Ma:

 
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

Penso @Christoph Metzendorf risposta era corretta ...

Per poter accedere a un campo direttamente bisogna anteporre con una @ segno :

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

... ma aggiungo che nel tuo esempio il tuo metodo getBar ha annullato il metodo getBar generato da Groovy per te. È possibile utilizzare la sintassi precedente per accedere direttamente a bar se si desidera continuare a sovrascrivere il metodo getBar predefinito Groovy generato, oppure non è possibile ignorare lo getBar in modo che qualsiasi chiamata a getBar utilizzi il Groove generato per te.

Problemi correlati