静态方法中的非静态变量“this”

时间:2010-11-07 13:38:36

标签: groovy

我读过这篇文章: https://www.ibm.com/developerworks/java/library/j-javadev2-8/index.html

清单2中的抽象类Model具有静态变量数据存储区。

abstract class Model {
 static def datastore = DatastoreServiceFactory.datastoreService
  ...

清单3中的Race类扩展了抽象类Model。

class Race extends Model {
 public Race(params){
  super(params)
 }
}

在清单5和清单6中,在静态方法中使用作者非静态变量数据存储( this.datastore )。我想,静态方法是在Race类中。

static def findByName(name){
     def query = new Query(Race.class.simpleName)
     query.addFilter("name", Query.FilterOperator.EQUAL, name)
     def preparedQuery = this.datastore.prepare(query)
     if(preparedQuery.countEntities() > 1){
      return new Race(preparedQuery.asList(withLimit(1))[0])
     }else{
      return new Race(preparedQuery.asSingleEntity())
     }
    }

怎么可能?谢谢你的解释。
汤姆

2 个答案:

答案 0 :(得分:4)

编辑 - 你是对的,我以前完全走错了轨道。答案很简单,在groovy中,你可以在静态方法中使用'this'关键字。

http://groovy.codehaus.org/Differences+from+Java

当像这样使用时,'this'指的是类,而不是实例。 Groovy的。

答案 1 :(得分:4)

静态编译 - Java,调用实例代码的静态代码无法编译。这是因为静态代码不会在实例上调用,而是在类型上直接调用 - 这会导致运行时错误。

虽然理论上可以静态编译Groovy代码,但默认是动态编译它。 “动态”意味着,部分地,字节码中的代码工件(如方法,变量,构造函数,类等)之间没有直接引用。

考虑以下Groovy类:

class StaticClass {
    static def someString = "someString"

    static def staticMethod() {
        this.someString
    }

    static def main(args) {
        StaticClass.staticMethod()
        new StaticClass().staticMethod()
    }
}

使用Groovy编译器groovyc,它被编译为能够在运行时动态执行的代码。以下代码表示编译后的上述main(..)方法:

public static void main(String[] args) {
    CallSite[] arrayOfCallSite = $getCallSiteArray(); 
    arrayOfCallSite[0].call($get$$class$StaticClass());

    arrayOfCallSite[1].call(arrayOfCallSite[2].callConstructor(
        $get$$class$StaticClass())); return;
}

调用此代码时真正发生的事情很难说,因为在运行时涉及的高度复杂且嵌套的决策流程和工作流程取决于几个因素。

正如在这个简单的示例中,没有涉及特殊情况(元类,扩展类,闭包,拦截器等),毕竟可能会调用GroovyObject.invokeMethod(String, Object)的实现。

在整个Groovy文档(包括用户指南和Wiki,但最多missing JavaDocs和源代码发布中缺少源文件)中,这个“动态运行时元编程”的机制对用户是隐藏的 - 可能是因为它具有巨大的复杂性,并且因为用户不需要详细了解它。对于Groovy核心开发人员来说,这非常有趣。

所以,毕竟,在对象实例上调用 not 时,很难说为什么 this有效。另一个问题是是否工作......