1. ホーム
  2. java

ラムダ:ローカル変数にはfinalが必要だが、インスタンス変数には必要ない

2023-08-14 17:08:53

質問

ラムダでは、ローカル変数はfinalにする必要がありますが、インスタンス変数はfinalにする必要はありません。なぜでしょうか?

どうすれば解決するのか?

フィールドとローカル変数の根本的な違いは、ローカル変数が コピーされた というように、JVMがラムダインスタンスを生成する際にコピーされます。一方、フィールドは自由に変更することができます。なぜなら、フィールドへの変更は外部のクラスインスタンスにも伝搬されるからです(フィールドの スコープ は外のクラス全体に及ぶ)。

匿名クラス、クロージャ、Labmdasについて考える最も簡単な方法は 変数スコープ の観点からです。クロージャに渡すすべてのローカル変数に対してコピーコンストラクタが追加されていると想像してください。