(快速参考)

静态类型检查和编译

4.0.2

静态类型检查和编译

Groovy是一种动态语言,默认情况下,Groovy使用一种动态调度机制来执行方法调用和属性访问。这种动态调度机制为该语言提供了很大的灵活性和功能。例如,可以在运行时动态地将方法添加到类中。可以在运行时动态替换现有方法,诸如此类的功能很重要,并且为语言提供了强大的功能。但是,有时您可能希望禁用此动态调度,而采用更静态的调度机制,而Groovy提供了一种方法做到这一点,告诉Groovy编译器特定类应该静态编译的方法是用标记该类。常规转换CompileStatic注释如下所示

 常规转换CompileStatic

静态编译
 我的课 {

    此类将被静态编译

}

看到这些关于Groovy静态编译的说明有关如何的更多详细信息静态编译可行,为什么您要使用它

使用限制之一静态编译是,当您使用它时,您将无法获得动态调度所提供的功能和灵活性。例如,在365bet地区中,您将无法从标有的类中调用GORM动态查找器静态编译因为编译器无法验证动态查找器方法的存在,因为它在编译时不存在,所以可能是您想利用Groovy的静态编译优势而又不放弃对365bet地区特定对象(例如动态查找器)进行动态分配的权限在哪grails编译器365bet地区CompileStatic进来365bet地区CompileStatic表现就像静态编译但了解某些365bet地区功能,并允许动态访问这些特定功能

365bet地区CompileStatic注释

365bet地区CompileStatic

365bet地区CompileStatic注释可以应用于类或类中的方法

 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
 某类 {

    该类中的所有代码将被静态编译

    定义 美沙酮() {
        // ...
    }

    定义 方法二() {
        // ...
    }

    定义 方法三() {
        // ...
    }
}
 grails编译器365bet地区CompileStatic

 某类 {

    methadOne和方法三将被静态编译
    methodTwo将被动态编译

    365bet地区CompileStatic
    定义 美沙酮() {
        // ...
    }

    定义 方法二() {
        // ...
    }

    365bet地区CompileStatic
    定义 方法三() {
        // ...
    }
}

可以用365bet地区CompileStatic并通过将其标记为排除特定方法365bet地区CompileStatic并指定应针对该特定方法跳过类型检查,如下所示

 grails编译器365bet地区CompileStatic
 常规转换TypeCheckingMode

365bet地区CompileStatic
 某类 {

    methadOne和方法三将被静态编译
    methodTwo将被动态编译

    定义 美沙酮() {
        // ...
    }

    365bet地区CompileStatic类型检查模式跳过定义 方法二() {
        // ...
    }

    定义 方法三() {
        // ...
    }
}

标有的代码365bet地区CompileStatic将全部进行静态编译,但无法静态编译365bet地区特定的交互,但是365bet地区CompileStatic可以识别为允许动态分配,包括在配置块中调用动态查找器和DSL代码,例如域类中的约束和映射闭包

在决定静态编译代码时,必须小心谨慎。静态编译有很多好处,但是要利用这些好处,您就放弃了动态分配的功能和灵活性。例如,如果代码是静态编译的,则无法利用运行时的优势。插件可能提供的元编程增强功能

365bet地区TypeChecked注释

365bet地区TypeChecked

grails编译器365bet地区TypeChecked注释的工作原理与365bet地区CompileStatic批注,除了它仅启用静态类型检查而不是静态编译外,它为无法在编译时进行静态验证的表达式提供了编译时反馈,同时仍为该类保留了动态分派

 grails编译器365bet地区TypeChecked

365bet地区TypeChecked
 某类 {

    此类中的所有代码均为静态类型
    检查并在运行时动态调度

    定义 美沙酮() {
        // ...
    }

    定义 方法二() {
        // ...
    }

    定义 方法三() {
        // ...
    }
}