Mendeklarasikan suatu variabel finalatau tidak mendeklarasikannya final, tetapi menjaganya agar tetap final dapat menghasilkan (tergantung pada kompiler) dalam bytecode yang berbeda.
Mari kita lihat contoh kecil:
public static void main(String[] args) {
final boolean i = true; // 6 // final by declaration
boolean j = true; // 7 // effectively final
if (i) { // 9
System.out.println(i);// 10
}
if (!i) { // 12
System.out.println(i);// 13
}
if (j) { // 15
System.out.println(j);// 16
}
if (!j) { // 18
System.out.println(j);// 19
}
}
Yang sesuai bytecode dari mainmetode (Java 8u161 pada Windows 64 Bit):
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iconst_1
3: istore_2
4: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
7: iconst_1
8: invokevirtual #22 // Method java/io/PrintStream.println:(Z)V
11: iload_2
12: ifeq 22
15: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_2
19: invokevirtual #22 // Method java/io/PrintStream.println:(Z)V
22: iload_2
23: ifne 33
26: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
29: iload_2
30: invokevirtual #22 // Method java/io/PrintStream.println:(Z)V
33: return
Tabel nomor baris yang sesuai:
LineNumberTable:
line 6: 0
line 7: 2
line 10: 4
line 15: 11
line 16: 15
line 18: 22
line 19: 26
line 21: 33
Seperti yang kita lihat source code di garis 12, 13, 14tidak muncul dalam kode byte. Itu karena iini truedan tidak akan mengubah keadaan itu. Dengan demikian kode ini tidak dapat dijangkau (lebih banyak dalam jawaban ini ). Untuk alasan yang sama, kode pada baris 9juga tidak ada. Keadaan itidak harus dievaluasi karena truepasti.
Di sisi lain meskipun variabel jadalah efektif akhir itu tidak diproses dengan cara yang sama. Tidak ada optimasi yang diterapkan. Keadaan jdievaluasi dua kali. Bytecode adalah sama terlepas dari jmenjadi efektif akhir .