「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java のラムダでは、インスタンス変数ではなく、ローカル変数が Final である必要があるのはなぜですか?

Java のラムダでは、インスタンス変数ではなく、ローカル変数が Final である必要があるのはなぜですか?

2024 年 11 月 14 日公開
ブラウズ:368

Why Do Lambdas in Java Require Local Variables to be Final, but Not Instance Variables?

ラムダと変数スコープ: ローカル変数にファイナリティが必要な理由

Java でラムダを使用する場合、興味深い違いが生じます: ローカル変数は宣言する必要がありますインスタンス変数はそうではありませんが、final として使用されます。この謎を解明するために、それらの動作の基本的な違いを詳しく調べてみましょう。

フィールドの可変性とローカル変数

フィールドとローカル変数の主な違いは次のとおりです。彼らの可変性。フィールドはインスタンス変数とも呼ばれ、オブジェクトのインスタンス内に存在し、動的に変更できます。対照的に、ローカル変数は JVM のスタックに保存され、初期化後にその値を変更することはできません。

ラムダ動作

ラムダ式を定義するとき、コンパイラは関数インターフェイスを実装する匿名クラス。このクラスはラムダのコードをカプセル化し、ラムダに渡されるローカル変数を初期化する合成コンストラクターを持っています。

ローカル変数の最終性

重要なことに、これらのローカル変数は、 lambda の匿名クラスは、周囲のコンテキストから値をコピーすることによって初期化されます。これは、元のコピーが呼び出し元のコンテキストで変更されないままであるため、ラムダ内で値を変更できないことを意味します。潜在的なエラーを回避するために、コンパイラはラムダのローカル変数に Final キーワードを強制します。一方、

未変更のインスタンス変数

インスタンス変数は、次の影響を受けません。同じ制限です。これは、ラムダの匿名クラス内のインスタンス変数に加えられた変更がオブジェクト インスタンスに反映されるためです。その結果、ラムダのスコープはラムダの実行コンテキストを超えて拡張され、ファイナリティの必要がなくなります。

結論

ラムダのローカル変数とインスタンス変数のこの区別は、結局はスコープに帰着します。そして可変性。スコープが限定されているローカル変数は呼び出し元のコンテキストの破損を防ぐためにファイナリティを必要としますが、インスタンス変数はラムダのライフサイクルを超えたより広いスコープによりダイナミズムを保持します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3