我曾經認爲private val
和private final val
一樣,直到我Scala中參考用SAW 4.1節:爲什麼`private val`和`private final val`不同?
恆定值的定義是以下形式的
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'已經是不可變的,爲什麼我們在Scala中需要'final'關鍵字呢?爲什麼編譯器不能像'final val'一樣對待所有'val'? – Jesper
請注意,'private'作用域修飾符與Java中的'package private'具有相同的語義。你可能會說'私人[this]'。 –
@ConnorDoyle:作爲包私人?我不這麼認爲:'private'意味着它只對這個類的實例可見,'private [this]'只有這個實例 - 除了相同的類**的實例外,'private'不允許任何人(包括來自相同的包)來訪問該值。 – Make42