[解決済み] なぜ `private val` と `private final val` は違うのですか?
疑問点
私は以前、次のように考えていました。
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 Referenceに書いてあった通りです。
private val
は
private final val
.
なぜ
スカラ
は単に
private val
として
private final val
? 何か根本的な理由があるのでしょうか?
どのように解決するのですか?
これは単なる推測ですが、右辺にリテラルを持つ最後の静的変数が定数としてバイトコードにインライン化されることは、Java における長年の悩みの種でした。これは確かにパフォーマンス上の利点がありますが、定数が変更された場合、定義のバイナリ互換性が損なわれてしまいます。値が変更される可能性のある最終的な静的変数を定義する場合、Java プログラマーは、メソッドまたはコンストラクターで値を初期化するなどのハックに頼らなければなりません。
Scalaのvalは、Javaの意味においてすでにfinalです。Scalaの設計者は、冗長な修飾子finalを使って、定数値をインライン化する許可"を意味しているように見えます。つまり、Scalaプログラマはハックに頼ることなく、この動作を完全に制御することができます。もし、インライン定数、つまり決して変化してはならないが高速な値が欲しければ、 "final val" と書きます。もし、バイナリ互換性を破壊せずに値を柔軟に変化させたい場合は "val" だけです。
関連
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] パブリック、プライベート、プロテクトの違いは何ですか?
-
[解決済み] Javaリフレクションを用いた静的なプライベートfinalフィールドの変更
-
[解決済み】Javaで異なるクラスからプライベートフィールドの値を読み取る方法は?
-
[解決済み】finalとeffectly finalの違いについて
-
[解決済み] 依存するメソッドタイプの説得力のある使用例とは?
-
[解決済み] Any、AnyVal、AnyRef、Objectの関係と、Javaコードでのマッピングについて教えてください。
-
[解決済み] Scalaにおけるparam: _*の意味とは?
-
[解決済み] Scalaの慣用表現「flatmap that s*** 」はどこから来たのか?
-
[解決済み] タイプダイナミックの仕組みと使い方を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Scalaのforループは下降か減少か?
-
[解決済み] HDFSではなく、ローカルファイルをsc.textFileで読み込む方法
-
[解決済み] Scala の private と protected コンストラクタ
-
[解決済み] ジッパーがコモナドである理由を理解する
-
[解決済み] Scala の Case Classes のオーバーロード・コンストラクタ?
-
[解決済み] build.sbtとbuild.scalaの違いは何ですか?
-
[解決済み] Scalaのcaseクラスを宣言することのデメリットは何ですか?
-
[解決済み] Scalaでサブアレイを取得する正しい方法は何ですか?
-
[解決済み] scala で複数の case class をマッチングさせる
-
[解決済み] SBTのrunアクションでアプリケーションを実行するために、JVMの最大ヒープサイズを"-Xmx "で指定する方法は?