Saya dulu berpikir begitu private valdan private final valsama, sampai saya melihat bagian 4.1 di Referensi Scala:
Definisi nilai konstan adalah dari bentuknya
final val x = edi mana e adalah ekspresi konstan (§6.24). Pengubah terakhir harus ada dan tidak ada anotasi jenis yang dapat diberikan. Referensi ke nilai konstanta x sendiri diperlakukan sebagai ekspresi konstan; dalam kode yang dihasilkan, mereka digantikan oleh sisi kanan definisi e.
Dan saya telah menulis tes:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
javap -c keluaran:
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
}
Kode byte seperti yang dikatakan Referensi Scala: private valbukan private final val.
Mengapa tidak scalac hanya memperlakukan private valsebagai private final val? Apakah ada alasan yang mendasarinya?
privatepengubah cakupan memiliki semantik yang sama seperti package privatedi Java. Anda mungkin bermaksud mengatakan private[this].
privatemaksudnya itu hanya terlihat untuk instance kelas ini, private[this]hanya instance ini - kecuali untuk instance dari kelas yang sama , privatetidak mengizinkan siapa pun (termasuk dari paket yang sama) untuk mengakses nilai.
valsudah tidak dapat diubah, mengapa kita membutuhkanfinalkata kunci sama sekali di Scala? Mengapa kompilator tidak bisa memperlakukan semuavaldengan cara yang sama sepertifinal vals?