GINA之Groovy的".@"语法

GINA:GroovyInAction

预备知识介绍:Groovy的Bean,可以直接定义其属性,而不需要象Java那样有对于的get/set方法(其实Groovy在背后已经偷偷的帮你完成)。比如
// Java
public class MyBean implements java.io.Serializable {
private String myprop;
public String getMyprop(){
return myprop;
}
public void setMyprop(String value){
myprop = value;
}
}
对应的Groovy代码只需这样即可
class MyBean implements Serializable {
String myprop
}
    再看如下代码
class DoublerBean {
public value
void setValue(value){
this.value = value
}
def getValue(){
value * 2
}
}
def bean = new DoublerBean(value: 100)
assert 200 == bean.value
assert 100 == bean.@value

    首先11行的bean.value将调用getValue并且返回双倍的value值,但请注意第7行的代码显示,如果此处的value也是getValue调用的话,那将得到一个无穷尽的递归调用。同理setValue也是。

    因此引出Groovy的Bean规则:在field的词法范围内(Insidethelexicalscopeofafield)对实例fieldname或者this.fieldname的引用,将被解释为字段(field)。范围以外的时候,可以通过实例.@fieldname来访问。

    结论:将Bean的熟悉信息作为Field(.@语法)也好,Property也好,或者set/get方法也好,都不应该混淆这些入口方法,要保持访问方法的唯一性。

相关推荐