Its final ... (17 July 2006)
Recently i noticed that the
final keyword in Java can be used inside a method body. I was interested about the compiler's behavior regarding this issue. So i i wrote the following program:
public class Test {
public static void main(String[] args) {
int i = 10;
System.out.println(i);
}
}
I compiled it and decompiled the produced class:
bkarak@elric:~> javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: istore_1
3: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
6: iload_1
7: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
10: return
}
So far all are ok ... just a program that prints out the number 10 after one assignment. I modified the program, and used the
final keyword in the declaration of the variable
i.
public class Test {
public static void main(String[] args) {
final int i = 10;
System.out.println(i);
}
}
The generated code is the following:
bkarak@elric:~> javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: bipush 10
5: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
8: return
}
As we can see in the first case the variable
i was stored in the method's local variable area using the
istore_1 and the
iload_1 commands. In the second case these were ommited and the value
10 was inlined. I think it is typical for the final keyword to trigger this kind of optimization from the compiler. I am curious what happens in more complex cases. :)