Похоже, что groovyc
не будет указывать конечные переменные так, как это делает javac. Я создал два тестовых сценария, один из которых был финальным, а другой нет:
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
:
Без 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
С 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 - плохой выбор для начала. Заключение заключительных переменных не избавит вас от необходимости использования отражения для вызовов методов.