Scala Reference のセクション 4.1 を見るまでは、private val
とは同じだと思っていました。private final val
定数値定義の形式は次のとおりです。
final val x = e
ここで、e は定数式です (§6.24)。final 修飾子が存在する必要があり、型注釈を指定することはできません。定数値 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
is not private final val
.
scalacが単に として扱わprivate val
れないのはなぜprivate final val
ですか? 根本的な理由はありますか?