2009-09-23 14 views
6

以前は、Groovyのプロパティがスコープ指定キーワードの省略によって示されていると思いました。つまりしかしGroovyのプロパティ定義

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

では、次のスクリプトを印刷「ゲッターヴァル」

class Foo { 
    public bar = "init val" 

    public getBar() { 
    "getter val" 
    } 
} 

println new Foo().bar 

barにアクセスしたときにゲッターが呼び出されるという事実があることを示唆しているので、私は、このことについて間違ったよ表示されます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メソッドがGroovyが生成したgetBarメソッドをオーバーライドしていると付け加えます。あなたはGroovyのがあなたのために生成された、またはあなただけのgetBarへの呼び出しはGroovyのがあなたのために生成されたゲッターを使用しますので、getBarをオーバーライドすることができませんでしデフォルトgetBarメソッドをオーバーライドし続けたい場合は、直接アクセスbarに上記の構文を使用することができます。

関連する問題