最佳答案
我曾经认为 private val
和 private final val
是一样的,直到我在 Scala Reference 中看到4.1节:
常数值定义的形式为
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 Reference 所说: private val
不是 private final val
。
为什么 Scalac不把 private val
当作 private final val
? 有什么深层次的原因吗?