2009-09-23 24 views
6

以前我還以爲是在Groovy的屬性是由作用域關鍵字遺漏表示。換句話說Groovy的屬性定義

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

但是,看來我是不正確有關這一點,因爲下面的腳本打印出「吸VAL」

class Foo { 
    public bar = "init val" 

    public getBar() { 
    "getter val" 
    } 
} 

println new Foo().bar 

,當bar被訪問的getter被調用的事實表明, bar是屬性而不是字段。那麼Groovy中的字段和屬性究竟有什麼區別?

謝謝, 唐

回答

3

爲了直接訪問一個字段,你必須用一個@符號加前綴:

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

那的new Foo().getBar()工程的縮寫形式,雖然bar不是屬性,仍然是簡潔從我的角度來看。

相反,您不能撥打電話foo.setBar("setter val"),但如果您將bar定義爲不帶訪問修飾符的屬性,則可以。

1

使用改性劑確實抑制財產的創造。什麼是混淆你的是,.似乎在現場訪問時回退沒有這樣的屬性存在。

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

但是:

 
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

我覺得@Christoph Metzendorf的答案是正確的......

爲了直接訪問一個字段你有一個@符號 加前綴:

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

...但我想補充一點,在你的Foo例如您getBar方法推翻那個時髦爲您生成的getBar方法。您可以使用上述語法直接訪問bar如果你想繼續壓倒一切的Groovy爲您生成的默認getBar方法,或者你可以只是沒有覆蓋getBar所以getBar任何調用將使用Groovy爲你所產生的吸氣劑。