我想知道变量如何标记为final由 Groovy 解释(在 1.8.0、1.8.1 中)。我知道这在 Java 中是有意义的,并且可以提高性能,当然还有助于避免愚蠢的错误。我想了解如果final可以帮助java编译器优化用Groovy编写的程序。我想知道 Groovy 变压器是否保留final变量的标记。
看来不是这样groovyc
将以 javac 的方式内联最终变量。我创建了两个测试脚本,一个使用 Final,另一个不使用:
final String message = "Hello World"
println message
String message = "Hello World"
println message
javap -c
为两个类产生相同的输出:
0: invokestatic #18; //Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
3: astore_1
4: ldc #58; //String Hello World
6: astore_2
7: aload_1
8: ldc #59; //int 1
10: aaload
11: aload_0
12: aload_2
13: invokeinterface #63, 3; //InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.callCurrent:(Lgroovy/lang/GroovyObject;Ljava/lang/Object;)Ljava/lang/Object;
18: areturn
19: nop
javac
优化掉了astore
/aload
:
Without final
:
0: ldc #2; //String Hello World
2: astore_1
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return
With final
:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String Hello World
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
话虽如此,如果性能至关重要,那么 Groovy 一开始就是一个糟糕的选择。内联最终变量不会为您节省使用反射进行方法调用的开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)