एक वैरिएबल की घोषणा करना finalया इसे घोषित नहीं करना final, लेकिन इसे प्रभावी रूप से अंतिम रखने से परिणाम (कंपाइलर पर निर्भर करता है) अलग-अलग बायोटेक में हो सकता है।
एक छोटे से उदाहरण पर नजर डालते हैं:
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
}
}
mainविधि के संबंधित बाइटकोड (विंडोज़ 64 बिट पर जावा 8u161):
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
इसी पंक्ति संख्या तालिका:
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
हम लाइनों पर स्रोत कोड देख 12, 13, 14बाइट कोड में प्रकट नहीं होता। ऐसा इसलिए iहै क्योंकि trueयह राज्य है और नहीं बदलेगा। इस प्रकार यह कोड अप्राप्य है (इस उत्तर में अधिक )। इसी कारण से लाइन में कोड 9भी छूट जाता है। iयह trueसुनिश्चित करने के लिए नहीं है कि राज्य का मूल्यांकन किया जाना है ।
दूसरी ओर, हालांकि चर पर jहै प्रभावी रूप से अंतिम यह उसी प्रकार से संसाधित नहीं कर रहा है। ऐसी कोई अनुकूलन लागू नहीं हैं। की स्थिति का jमूल्यांकन दो बार किया जाता है। प्रभावी रूप से अंतिमj होने की परवाह किए बिना बाइटकोड समान है ।