我什么时候/为什么要使用Groovy';s@CompileStatic?

我什么时候/为什么要使用Groovy';s@CompileStatic?,groovy,annotations,Groovy,Annotations,我已经读过这篇:,这篇:,并且了解到肯定会有性能改进,但这是真的吗?我不太明白@CompileStatic到底做什么 在某些类上添加@CompileStatic是不需要动脑筋的吗?我在哪里不想要它?引用我的部分答案: 虽然比普通的Groovy快,但它只能编译Groovy的一个子集,并且行为有点不同。尤其是所有的动态功能不再可用 所有MOP将被旁通。构建器一般不会工作,有些构建器对编译器进行了扩展,以允许它们通过。此外,在编译时使用静态类型选择方法,而Groovy通常使用运行时可用的方法和运行时类

我已经读过这篇:,这篇:,并且了解到肯定会有性能改进,但这是真的吗?我不太明白
@CompileStatic
到底做什么


在某些类上添加
@CompileStatic
是不需要动脑筋的吗?我在哪里不想要它?

引用我的部分答案:

虽然比普通的Groovy快,但它只能编译Groovy的一个子集,并且行为有点不同。尤其是所有的动态功能不再可用

所有MOP将被旁通。构建器一般不会工作,有些构建器对编译器进行了扩展,以允许它们通过。此外,在编译时使用静态类型选择方法,而Groovy通常使用运行时可用的方法和运行时类型。这可能导致调用不同的方法

当然@CompileStatic也提供了一些安全性,因为编译器的任务是在运行时验证程序。但由于静态信息注定是不完整的,因此永远不可能有100%的安全性

那么,它在哪里呢。。。好。。。例如POGO,因为它们通常不包含那么多代码。当然,对于通过复制粘贴从Java移植到Groovy的类


我想把它放在哪里?嗯,目前可能在Android上,因为代码大小会产生影响,静态编译的代码更紧凑。否则,我个人完全可以不使用@CompileStatic。这更多的是品味问题。在某些情况下,紧密循环的性能会有所提高,但这需要您首先通过分析应用程序来进行识别,结果是当AOT编译groovy程序时,
@CompileStatic
——例如使用GraalVM
本机映像
工具。
native image
MethodHandle
支持仅限于
MethodHandle
对象是编译时常量的情况。通过使用编译器配置,如:

import groovy.transform.CompileStatic
withConfig(configuration) {
    ast(CompileStatic)
}

您可以在生成的字节码中消除动态
MethodHandle
实例,让提前编译成功。

您希望更快/类型检查的类,并且不需要动态功能?引用块来自哪里?从你所引用的答案看不出来。韦斯顿,你是对的,我错过了一条新行,这让引用看起来像是在继续。我更正了,你能告诉我如何在其他类中使用@CompileStatic注释调用其他类的闭包吗class@JahongirSabirov为什么不举个例子呢?