私はそれを考えるために使用される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 private
Java と同じセマンティクスを持っていることに注意してください。あなたは言うつもりかもしれませんprivate[this]
。
private
平均それは、このクラスのインスタンスにのみ表示されていることprivate[this]
だけで、このインスタンス-同じのインスタンスを除き、クラス、private
誰もが(同じパッケージから含める)値にアクセスすることはできません。
val
はすでに不変なので、なぜfinal
Scalaでキーワードがまったく必要なのでしょうか。コンパイラがすべてval
のをと同じように処理できないのはなぜfinal val
ですか?