2012-05-20 15 views
6

メソッドローカルの内部クラスは、メソッドが終了してもまだメソッドローカルの内部クラスのインスタンスが存続している可能性があるため、ローカル変数にアクセスできません。しかし、ローカルメソッドが終了すると、ローカル変数は消えてしまいます。 メソッドローカルの内部クラスが最終的なローカル変数にアクセスできることを知りました。これは、メソッドが終了した後もまだ最終的なローカル変数が生きているのでしょうか?Javaの最終ローカル変数の範囲

+3

誰もあなたの質問を間違って誤解しないようにあなたの例を投稿してください。われわれはコーダーであり、Javaコードはこれをもっと明確にするだろう。 – jmort253

+0

私はこれがあなたが意味するものだと思っています。それはうまく動作しません。 http://ideone.com/LNg9w –

+0

@HunterMcMillen質問はメソッドローカルクラスであり、他のメソッドではありません。 – Jeffrey

答えて

7

並べ替えJavaの匿名の内部クラスは、「クロージャ」のように動作します。つまり、現在のローカル状態を「閉じ」ます。しかし、Javaでは、これらのクラスを最終変数の周りで閉じることができます。そうでない場合、変数のローカル状態は変更される可能性がありますが、内部クラスに保持されているバージョンは変更されないため、「古くなった」インスタンスにアクセスすることになります。これはプログラマにとって混乱を招く可能性があります。

代わりに、Javaでは、変数の再割り当てではなく、メソッドによってインスタンスによって変更可能性が処理される必要があります。これにより、より明瞭になり、より簡単なデバッグが可能になります。 Javaがこれを行う理由の詳細については、this answerを参照してください。

クラスには依然として変数への参照が保持されているため、質問に対する回答はありです。内部クラスが変数の所有権を放棄するまで、そのインスタンスはガベージコレクションされません。

+1

* "これはプログラマーにとって混乱を招くかもしれません。" * - さらに多くの点では、これ以上クロージャーに似ていません。レキシカルコンテキストに応じて、異なるバインディングを持つ識別子の名前を持つことになります。 –

+0

@Stephen十分に公正で、良い点。 –

1

いいえ、それはありません。ローカル変数のコピーがまだ内部クラスのインスタンスで生きていることを意味します。 「最後」は、2つのコピーが混乱しないように価値があることを確認するだけです。