Saya dulu berpikir begitu private val
dan private final val
sama, sampai saya melihat bagian 4.1 di Referensi Scala:
Definisi nilai konstan adalah dari bentuknya
final val x = e
di 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 val
bukan private final val
.
Mengapa tidak scalac hanya memperlakukan private val
sebagai private final val
? Apakah ada alasan yang mendasarinya?
private
pengubah cakupan memiliki semantik yang sama seperti package private
di Java. Anda mungkin bermaksud mengatakan private[this]
.
private
maksudnya itu hanya terlihat untuk instance kelas ini, private[this]
hanya instance ini - kecuali untuk instance dari kelas yang sama , private
tidak mengizinkan siapa pun (termasuk dari paket yang sama) untuk mengakses nilai.
val
sudah tidak dapat diubah, mengapa kita membutuhkanfinal
kata kunci sama sekali di Scala? Mengapa kompilator tidak bisa memperlakukan semuaval
dengan cara yang sama sepertifinal val
s?