Scala Reference'da bölüm 4.1'i görene kadar bunu düşünürdüm private val
ve private final val
aynıydım:
Sabit bir değer tanımı formdadır
final val x = e
e sabit bir ifadedir (§6.24). Son değiştirici mevcut olmalıdır ve hiçbir tür açıklaması verilmemelidir. X sabit değerine yapılan referansların kendileri sabit ifadeler olarak ele alınır; üretilen kodda, tanımın sağ tarafı e ile değiştirilir.
Ve bir test yazdım:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c
çıktı:
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
}
Bayt kodu, Scala Reference'ın dediği gibi: private val
değildir private final val
.
Neden gelmez scalać sadece tedavi private val
olarak private final val
? Altta yatan herhangi bir sebep var mı?
val
zaten değişmez olduğundan,final
Scala'da anahtar kelimeye neden ihtiyacımız var ? Derleyici neden hepsineval
aynı şekildefinal val
davranamıyor?