ฉันเคยคิดแบบนั้นprivate val
และprivate final val
เหมือนกันจนกระทั่งฉันเห็นหัวข้อ 4.1 ใน Scala Reference:
นิยามค่าคงที่เป็นรูปแบบ
final val x = e
โดยที่ e คือนิพจน์คงที่ (§6.24) ต้องมีตัวปรับแต่งขั้นสุดท้ายและไม่สามารถระบุคำอธิบายประกอบประเภทได้ การอ้างอิงถึงค่าคงที่ x ถือว่าเป็นนิพจน์คงที่ ในโค้ดที่สร้างขึ้นจะถูกแทนที่ด้วย e ด้านขวามือของนิยาม
และฉันได้เขียนแบบทดสอบ:
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
}
รหัสไบต์เป็นเพียง Scala อ้างอิงกล่าวว่า: ไม่ได้private val
private final val
ทำไมscalacถึงไม่ปฏิบัติprivate val
ตามprivate final val
? มีเหตุผลพื้นฐานหรือไม่?
val
ไม่เปลี่ยนรูปอยู่แล้วทำไมเราถึงต้องการfinal
คำหลักใน Scala เลย? เหตุใดคอมไพเลอร์จึงไม่สามารถปฏิบัติต่อทั้งหมดval
ได้เช่นเดียวกับfinal val
s