以前我认为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中字段和属性之间究竟有什么区别。
谢谢, 唐
答案 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)
你正在寻找在groovy中不存在的差异。
"In Groovy, fields and properties have been merged so that they act and look the same."
答案 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。