3

Java では、次のようなことができることを知っています。

public class Greeter {
    public void greetEventually() {
        final String greeting = "Hello!";
        Job j = new Job() {
            public void run() {
                System.out.println(greeting);
            }
        };
        j.schedule();
    }
}

Jobこれにより、将来のある時点で匿名が実行されます。これが機能するのは、匿名クラスが外側のスコープで final 変数を参照できるためです。

私がよくわからないのは、次のケースです。

public class Greeter {
    private String greeting;

    // ... Other methods that might mutate greeting ...

    public void greetEventually() {
        Job j = new Job() {
            public void run() {
                System.out.println(greeting);
            }
        };
        j.schedule();
    }
}

この場合、私の匿名Jobは、囲んでいるクラスの非最終フィールドを参照しています。greetingジョブが実行されると、フィールドの値は、ジョブが作成されたときと同じように表示されますか?それとも、ジョブが実行されているときと同じように表示されますか? 私は答えを知っていると思いますが、それは興味深い質問だと思いました.

4

3 に答える 3

9

greeting匿名Jobが実行されると、そのままの値が表示されます。

修飾子は、finalメンバー変数ではなく、ローカル変数にのみ必要です。

于 2010-02-12T01:11:16.790 に答える
1

(outer) を介してフィールドにアクセスしていますthisthis効果的にfinalローカル変数と考えることができます。ローカルのみがfinalであり、指しているオブジェクトは (必ずしも) 定数ではありません。と同じ値を持つローカル変数を想像してみてthisください。それは明らかです。

public class Greeter {
    private String greeting;

    // ... Other methods that might mutate greeting ...

    public void greetEventually() {

        private final Greeter greeter = this; // <---

        Job j = new Job() {
            public void run() {
                System.out.println(   greeter.greeting   ); // <---
            }
        };
        j.schedule();
    }
}
于 2010-02-12T08:48:08.723 に答える
-1

final 修飾子は、内部クラスの各インスタンスに変数を提供するためだけにローカル変数に適用されるため、以下を使用します。

変数のインスタンスが 1 つだけ必要な場合 (定数や共通リソースの場合など)、次を使用します。

于 2010-02-12T01:38:46.657 に答える