एक वैरिएबल की घोषणा करना 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
होने की परवाह किए बिना बाइटकोड समान है ।