আমি স্ক্যাল রেফারেন্সের ৪.১ ধারা না পাওয়া পর্যন্ত আমি এটি ভাবতাম private val
এবং private final val
একইরকম থাকতাম:
একটি ধ্রুবক মান সংজ্ঞা ফর্ম হয়
final val x = e
যেখানে ই একটি ধ্রুবক প্রকাশ (§6.24)। চূড়ান্ত সংশোধক অবশ্যই উপস্থিত থাকতে হবে এবং কোনও ধরণের টিকা দেওয়া যেতে পারে না। ধ্রুবক মান x এর উল্লেখগুলি তাদেরকে ধ্রুবক প্রকাশ হিসাবে গণ্য করা হয়; উত্পন্ন কোডে এগুলি সংজ্ঞাটির ডানদিকে ই দ্বারা প্রতিস্থাপিত হয়।
এবং আমি একটি পরীক্ষা লিখেছি:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c
আউটপুট:
Compiled from "PrivateVal.scala"
public class PrivateVal {
public int testPrivateVal();
Code:
0: aload_0
1: invokespecial #19 // Method privateVal:()I
4: ireturn
public int testPrivateFinalVal();
Code:
0: iconst_1
1: ireturn
public PrivateVal();
Code:
0: aload_0
1: invokespecial #24 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: putfield #14 // Field privateVal:I
9: return
}
স্কেল রেফারেন্স যেমনটি বলেছিল তেমনই বাইট কোডটি: private val
এটি নয় private final val
।
কেন নেই scalac শুধু চিকিত্সা private val
হিসাবে private final val
? কোন অন্তর্নিহিত কারণ আছে?
val
ইতিমধ্যে অপরিবর্তনীয়, তাই স্ক্যালায় আমাদেরfinal
কীওয়ার্ডের প্রয়োজন নেই কেন ? সংকলক কেন সমস্তval
এর সাথে একইভাবে আচরণ করতে পারে নাfinal val
?