-2

重複の可能性:
匿名内部クラスでのJavaローカル変数の可視性-「final」キーワードが必要なのはなぜですか?

いくつかのボタンを作成するこの関数があります。doActionメソッドでout.printlnアイテムを実行しようとしています。

    for (int i = 0; i < itemsList.size(); i++) {
        String item = itemsList.get(i);
        TButton button = new TButton("" + item, 8, 415 + (25 * i), 90, 25) {
            public void doAction() {
                System.out.println("" + item);
            }
        };
        this.framework.add(button);
    }

エラーが発生します

local variable item is accessed from within inner class

これを正しい方法で行うにはどうすればよいですか?

4

3 に答える 3

3

としてマークitemfinalます。これで問題が解決するはずです。この解決策

ローカルクラスは、最も確実にインスタンス変数を参照できます。非最終ローカル変数を参照できない理由は、メソッドが戻った後もローカルクラスインスタンスがメモリに残っている可能性があるためです。メソッドがローカル変数を返すとスコープ外になるため、それらのコピーが必要です。変数がfinalでない場合、メソッド内の変数のコピーは変更される可能性がありますが、ローカルクラス内のコピーは変更されないため、同期がとれなくなります。

匿名の内部クラスは、Javaでの実装方法のため、最終変数を必要とします。匿名内部クラス(AIC)は、ローカル変数の値のコピーを保持するプライベートインスタンスフィールドを作成することにより、ローカル変数を使用します。内部クラスは実際にはローカル変数を使用していませんが、コピーを使用しています。この時点で、元の値またはコピーされた値のいずれかが変更された場合に「BadThing」™が発生する可能性があることはかなり明白です。予期しないデータ同期の問題が発生します。この種の問題を防ぐために、Javaでは、AICによって使用されるローカル変数をfinal(つまり、変更不可)としてマークする必要があります。これにより、内部クラスのローカル変数のコピーが常に実際の値と一致することが保証されます。

于 2012-12-17T19:19:21.653 に答える
2

ファイナルを作成itemすると、問題が解決するはずです。

final String item = itemsList.get(i);

このような内部クラスまたは匿名クラスから非最終ローカル変数にアクセスすることはできません。

于 2012-12-17T19:19:15.990 に答える
1

finalキーワードを使用する必要があります。

試してみてくださいfinal String item=itemsList.get(i);

匿名オブジェクトはitem変数をキャプチャするため、後で変更しても意味がありません。したがって、不変にするために(持っている)必要があります。

于 2012-12-17T19:19:12.777 に答える