私はそれを考えるために使用されるprivate valとprivate final val、私はScalaのリファレンスセクション4.1を見るまで、同じです。
定数値の定義は次の形式です。
final val x = eここで、eは定数式です(§6.24)。最後の修飾子が存在する必要があり、型注釈を与えることはできません。定数値xへの参照自体は、定数式として扱われます。生成されたコードでは、定義の右側に置き換えられます。
そして私はテストを書きました:
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ですか?根本的な理由はありますか?
privateスコープ修飾子はpackage privateJava と同じセマンティクスを持っていることに注意してください。あなたは言うつもりかもしれませんprivate[this]。
private平均それは、このクラスのインスタンスにのみ表示されていることprivate[this]だけで、このインスタンス-同じのインスタンスを除き、クラス、private誰もが(同じパッケージから含める)値にアクセスすることはできません。
valはすでに不変なので、なぜfinalScalaでキーワードがまったく必要なのでしょうか。コンパイラがすべてvalのをと同じように処理できないのはなぜfinal valですか?