2009-09-23 5 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

: bar이 속성은 아니지만

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

new Foo().getBar() 작품의 짧은 형태, 여전히 내 관점에서 간결하다.

대조적으로 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 메소드를 계속 무시하거나 getBar에 대한 호출이 생성 된 getter Groovy를 사용할 수 있도록 getBar을 무시할 수있는 경우 위의 구문을 사용하여 bar에 직접 액세스 할 수 있습니다.