Groovy属性定义

时间:2009-09-23 14:13:43

标签: groovy

以前我认为Groovy中的属性由省略了作用域关键字表示。换句话说

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

然而,看起来我对此不正确,因为以下脚本打印“getter val”

class Foo {
  public bar = "init val"

  public getBar() {
    "getter val"
  }
}

println new Foo().bar

访问bar时调用getter的事实表明bar是属性而不是字段。那么Groovy中字段和属性之间究竟有什么区别。

谢谢, 唐

4 个答案:

答案 0 :(得分:3)

要直接访问某个字段,您必须在其前面添加@符号:

assert "getter val" == new Foo().bar
assert "init val" == new Foo().@bar

new Foo().getBar()的缩写形式虽然bar不是属性,但从我的观点来看仍然简洁明了。

相比之下,您无法拨打foo.setBar("setter val"),但如果您将bar定义为没有访问修饰符的属性,则可以。

答案 1 :(得分:1)

答案 2 :(得分: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}

答案 3 :(得分:0)

我认为@Christoph Metzendorf的回答是正确的......

  

为了直接访问某个字段,您必须在@前面添加一个字段   签名:

assert "getter val" == new Foo().bar
assert "init val" == new Foo().@bar

...但我想在您的Foo示例中添加getBar方法,以覆盖Groovy为您生成的getBar方法。如果要继续覆盖为您生成的默认bar方法Groovy,可以使用上述语法直接访问getBar,或者您可以不覆盖getBar以便对{{{{}}进行任何调用1}}将使用为您生成的getter Groovy。