覆盖控制器中的Getter

时间:2014-05-22 13:51:31

标签: grails groovy

我似乎无法覆盖grails控制器中的getter。我创建的示例代码用于说明这一点,如下所示:

class MyController extends RestfulController<MyDomainObj> {

    def field
    def getField(){
        field += 1
    }

    def index(MyCommand command) {
        field = 1
        // in a controller this prints 1, but in my class it prints 2
        println('field' + field)  
    }
}

如果我创建一个Groovy类并覆盖getter,那么它可以工作。

class X {

    public static void main(String[] args){
        def x = new X()
        x.field = 1
        println x.field
    }

    def field
    def getField(){
        field += 1
    }
}

我在控制器中做错了什么或控制器不支持此功能?如果不支持,那么有谁知道为什么?是什么魔法会导致这个功能不起作用?

1 个答案:

答案 0 :(得分:2)

对于类中的属性,Groovy直接使用生成的私有变量:

请参阅http://groovy.codehaus.org/Groovy+Beans

  

如果从类中访问属性,则定义属性   在编译时使用隐式或显式(例如   this.foo,或简称foo),Groovy将直接访问该字段   而不是通过吸气剂和设定者。

示例:

class C {

    def prop

    def getProp() {
            println "getter"
            prop
    }

    def dostuff() {
            prop = "Y"
            println prop
            println getProp()
    }

}

new C().dostuff()

结果

Y
getter
Y