問題タブ [final]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - EventHandlerがオブジェクトをfinalにする必要があるのはいつ、そしてなぜですか?
onModuleLoad()メソッドの一部であるGWTプロジェクトからの次のコードがあります(GWTがわからない場合は、Javaのmainメソッドに似ています)。
ここで2つのローカル変数が最終でなければならないのはなぜですか?
java - Java の final フィールドの値に対する「最新」の保証は、間接参照にも適用されますか?
Java 言語仕様では、セクション 17.5で final フィールドのセマンティクスを定義しています。
final フィールドの使用モデルは単純なものです。オブジェクトのコンストラクターでオブジェクトの最終フィールドを設定します。オブジェクトのコンストラクターが終了する前に、別のスレッドが参照できる場所に構築中のオブジェクトへの参照を書き込まないでください。これに従えば、オブジェクトが別のスレッドから見られるとき、そのスレッドは常に、そのオブジェクトの final フィールドの正しく構築されたバージョンを認識します。また、少なくとも最終フィールドと同じくらい最新の最終フィールドによって参照されるオブジェクトまたは配列のバージョンも表示されます。
私の質問は - 「最新」の保証は、ネストされた配列とネストされたオブジェクトの内容にまで及びますか?
簡単に言うと、1 つのスレッドが可変オブジェクト グラフをオブジェクトの final フィールドに割り当て、オブジェクト グラフが更新されない場合、すべてのスレッドが final フィールドを介してそのオブジェクト グラフを安全に読み取ることができますか?
シナリオ例:
- スレッド A は ArrayLists の HashMap を構築し、その HashMap をクラス「MyClass」のインスタンスの最終フィールド「myFinal」に割り当てます。
- スレッド B は、MyClass インスタンスへの (非同期の) 参照を確認し、「myFinal」を読み取り、ArrayLists の 1 つの内容にアクセスして読み取ります。
このシナリオでは、スレッド B から見た ArrayList のメンバーは、少なくとも MyClass のコンストラクターが完了したときと同じくらい最新であることが保証されていますか?
同期などの代替ソリューションではなく、Java メモリ モデルと言語仕様のセマンティクスの明確化を求めています。私の夢の答えは、関連するテキストを参照して、はいまたはいいえです。
アップデート:
- Java 1.5 以降のセマンティクス、つまり JSR 133 で導入された更新された Java メモリ モデルに興味があります。最終フィールドの「最新」の保証は、この更新で導入されました。
java - フィールドのプライベート静的最終キーワードに関するJavaの簡単な質問
私はフィールドを宣言しています:
まず、private static final
問題の順序はありますか?そうでない場合、標準的に受け入れられているシーケンスまたは規則はありますか?
第二に、filename
私のアプリケーションでは修正されています。これはその価値を保存するのに最適でしたか?
java - final を修飾子として使用すると、このキャッシュが機能しない理由
このインスタンスに対してカーソルを 1 回取得するためのこのコードがあり、最終としてマークしたにもかかわらず、ログはそれが何度も呼び出されたことを示しています。私は何が欠けていますか?
getAllContactsCached メソッドはリストを 1 回取得し、2 回目は最終的なオブジェクトを再利用して返す必要があります
java - Javaでは、コンストラクタヘルパーから最終フィールドを初期化できますか?
私には最後の非静的メンバーがいます:
コンストラクターによって呼び出されるメソッドを使用して初期化したいのですが。myMapはfinalであるため、「helper」メソッドはそれを直接初期化できません。もちろん、私には選択肢があります:
myMap初期化コードをコンストラクターに直接実装できます。
ヘルパーメソッドでHashMapを作成し、それをコンストラクターに返し、コンストラクターでオブジェクトをmyMapに割り当てることができます。
方法2は問題ありませんが、ヘルパーメソッドがmyMapを直接操作できるようにする方法があるかどうか疑問に思っています。おそらく、コンストラクターによってのみ呼び出すことができることを示す修飾子ですか?
java - デフォルトのコンストラクタが指定されていない場合、Javaシリアライゼーションはどのように最終フィールドをデシリアライズしますか?
シリアル化する必要がある不変の値の型を定義するクラスがあります。不変性は、コンストラクターで設定された最終フィールドに由来します。シリアル化を試みましたが、うまくいきました (驚くべきことに?) - しかし、方法がわかりません。
クラスの例はこちら
クラスに引数なしのコンストラクターがない場合、インスタンス化して最終的なフィールドを設定するにはどうすればよいでしょうか?
(余談ですが、IDEAはこのクラスに対して「no serialVersionUID」検査警告を生成していなかったにもかかわらず、シリアライズ可能にしたばかりの他のクラスに対して警告を正常に生成したため、特にこのクラスに気付きました。)
java - Java のメソッドで final インスタンス変数のコピーを作成するのはなぜですか?
重複の可能性:
ArrayBlockingQueue で、最終メンバー フィールドをローカルの最終変数にコピーするのはなぜですか?
例えば:
この方法は、多くの Java クラス (ArrayBlockingQueue など) で採用されています。これの利点は何ですか?
java - Javaの同時実行性:「カスケード」変数の揮発性と最終性?
は
と同じ
内部マップが異なるスレッドによってアクセスされる場合は?
または、このようなものが必要です:
それが「カスケードされた」マップではない場合、final と volatile は最終的に、すべてのスレッドが常に Map の正しい内容を確認できるようにするという同じ効果があります...しかし、Map 自体にマップが含まれている場合はどうなりますか?例のように...内部マップが正しく「メモリバリア」であることを確認するにはどうすればよいですか?
タンク!トム
java - 最終的な過渡フィールドとシリアル化
final transient
Javaでのシリアル化後に、デフォルト以外の値に設定されたフィールドを持つことは可能ですか?私のユースケースはキャッシュ変数です—それが理由ですtransient
。また、変更されないフィールドを作成する習慣がありMap
ます(つまり、マップの内容は変更されますが、オブジェクト自体は同じままです)final
。null
ただし、これらの属性は矛盾しているようです。コンパイラはそのような組み合わせを許可しますが、シリアル化を解除した後以外にフィールドを設定することはできません。
私は次のことを試みましたが、成功しませんでした。
- 単純なフィールドの初期化(例に示されています):これは私が通常行うことですが、初期化はシリアル化解除後に行われないようです。
- コンストラクターでの初期化(これは意味的には上記と同じだと思います)。
- でフィールドを割り当てる
readObject()
—フィールドが。であるため、実行できませんfinal
。
この例cache
ではpublic
、テスト専用です。
出力:
java - Java のローカル最終変数について
String
Java プログラムでは、メソッド宣言のように定義されるパラメーター。ただし、メソッド定義では、final String
変数としてアクセスされます。いくつかの問題(セキュリティ、メモリの問題など)につながるかどうか?
例えば:
メソッド宣言
メソッド定義
私を助けて、私の疑問を明確にしてください。前もって感謝します
PS私は内部クラスで使用する必要があるため、最終変数としてaとbにアクセスしています。