When/why 我想使用 Groovy 的 @CompileStatic 吗?

When/why would I want to use Groovy's @CompileStatic?

我读过这篇文章:http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/CompileStatic.html, and this: Should I use Groovy's @CompileStatic if I'm also using Java 7,我知道肯定会有性能改进,但真的如此吗?我不明白 @CompileStatic 是做什么的。

在某些 类 上添加 @CompileStatic 是否很容易?我哪里不想要?

引用我对Should I use Groovy's @CompileStatic if I'm also using Java 7的部分回答:

While faster than normal Groovy, it can compile only a subset of Groovy and behaves a bit different. Especially all the dynamic features are not available anymore.

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

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

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

我想要它在哪里?好吧,目前可能在 Android,因为代码大小有影响,静态编译代码更紧凑。否则,我个人完全可以不使用 @CompileStatic。这更像是一个品味问题。在某些情况下,紧密循环会提高性能,但这需要您首先通过分析您的应用程序来确定

当 AOT 编译 groovy 程序时,结果是 @CompileStatic can be useful - 例如使用 GraalVM native-image 工具。 native-image MethodHandle 支持仅限于 MethodHandle 对象是编译时常量的情况。通过使用像这样的编译器配置:

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

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