কোনও ভেরিয়েবল ঘোষণা করা 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
পদ্ধতি (জাভা 8u161 উইন্ডোজ 64 বিট উপর):
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
হচ্ছে কার্যকরভাবে চূড়ান্ত ।