質問

Javaの最終変数は何ですか?例:私が書く場合 final int temp; 機能では、最終キーワードの意味は何ですか?
また、最終変数(クラス変数としても関数変数としても)を使用するのはいつですか?
同期ブロック内の変数を最終的に宣言する必要があるのはなぜですか?

役に立ちましたか?

解決

基本的には、値を変更できないことを意味します。たとえば、変数には、コンストラクター(または可変初期イザー)に最終変数を1回(1回だけ)割り当てる必要があります。同期は、かなり直交概念です。

作成する主な理由 ローカル 可変ファイナルは、匿名の内側クラスでそれを使用できるようにするためです...これは同期ブロックにいることとは何の関係もありません。

最終変数 それは 確かに、不変のクラスに役立つ - そして、不変性はマルチスレッド環境での生活を容易にします - しかし、それは私が考えることができる2つの間の唯一の関係です...

編集:WildWezyrのコメントは、変数を変更しないという点で理にかなっています あなたが同期しているもの. 。彼が与えられた理由から、それは危険です。それはあなたが「同期ブロックの変数」と意味することですか?

他のヒント

最終変数と同期コードブロックには共通点があります...最終変数以外の変数を宣言した場合 a そして、書く synchronized (a) { System.out.println('xxx'); } 少なくともNetBeansでは、「非ファイナルフィールドでの同期」という警告が表示されます。

なぜファイナル以外のフィールドで同期してはならないのですか?フィールド値が変更される可能性がある場合、異なるスレッドが異なるオブジェクト(フィールドの異なる値)で同期する可能性があるため、まったく同期することはできません(すべてのスレッドが同時に同期ブロックに入ることがあります)。

ここでは、非ファイナル分野で同期することによって引き起こされる現実のトラブルの例をご覧ください。 http://forums.sun.com/thread.jspa?threadid=5379204

Jon Skeetが言ったことに加えて、値を変更することはできませんが、内容は変更される場合があります。

final Integer one = new Integer(1);
...
one = new Integer(2); // compile error

final List list = new ArrayList();
...
list = new ArrayList(); // compile error
list.add(1); // Changes list, but that's fine!

また、最終的で静的な決勝は同じではないことに注意してください。ファイナルはインスタンスの範囲内ですが、静的ファイナルはクラスのすべてのインスタンスで同じです(他の言語では、これは定数と呼ばれる可能性があります)。

個人的には、ソフトウェアを機能させるために絶対に必要ではない場合でも、最終的な利点は意味的な意味にあると思います。それはあなたにコンパイラに言う可能性を提供します そして、そのコードに取り組んでいる次の人 この変数が変更されることを意図していないこと、およびそれを変更しようとするとバグが生じる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top