ホームページ >Java >&#&チュートリアル >Java のラムダでは、インスタンス変数ではなく、ローカル変数が Final である必要があるのはなぜですか?
ラムダと変数スコープ: ローカル変数にファイナリティが必要な理由
Java でラムダを使用する場合、興味深い違いが生じます。ローカル変数は宣言する必要があります。インスタンス変数はそうではありませんが、final として使用されます。この謎を解明するために、それらの動作の基本的な違いを詳しく調べてみましょう。
フィールドの可変性とローカル変数
フィールドとローカル変数の主な違いは次のとおりです。彼らの可変性。フィールドはインスタンス変数とも呼ばれ、オブジェクトのインスタンス内に存在し、動的に変更できます。対照的に、ローカル変数は JVM のスタックに保存され、初期化後にその値を変更することはできません。
ラムダの動作
ラムダ式を定義するとき、コンパイラは関数インターフェイスを実装する匿名クラス。このクラスはラムダのコードをカプセル化し、ラムダに渡されるローカル変数を初期化する合成コンストラクターを持っています。
ローカル変数の最終性
重要なことに、これらのローカル変数は、 lambda の匿名クラスは、周囲のコンテキストから値をコピーすることによって初期化されます。これは、元のコピーが呼び出し元のコンテキスト内で変更されないため、ラムダ内で値を変更できないことを意味します。潜在的なエラーを回避するために、コンパイラはラムダのローカル変数に Final キーワードを強制します。
未変更のインスタンス変数
インスタンス変数は、一方、インスタンス変数の影響を受けません。同じ制限です。これは、ラムダの匿名クラス内のインスタンス変数に加えられた変更がオブジェクト インスタンスに反映されるためです。その結果、ラムダのスコープはラムダの実行コンテキストを超えて拡張され、ファイナリティの必要性がなくなりました。
結論
ラムダにおけるローカル変数とインスタンス変数のこの区別は、結局はスコープに帰着します。そして可変性。スコープが限定されているローカル変数は呼び出し元のコンテキストの破損を防ぐためにファイナリティを必要としますが、インスタンス変数はラムダのライフサイクルを超えたより広いスコープによりダイナミズムを保持します。
以上がJava のラムダでは、インスタンス変数ではなく、ローカル変数が Final である必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。