引用Java中匿名内部类中的封闭类的非final字段

Mik*_*els 3 java closures anonymous-types anonymous-class

在Java中,我知道可以这样做:

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

这将Job在将来的某个时刻执行匿名.这是有效的,因为允许匿名类引用封闭范围中的最终变量.

我不确定的是以下情况:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我的匿名Job是指封闭类的非final字段.作业运行时,我是否会看到greeting创建作业时的字段值,或者执行作业时的值?我想我知道答案,但我认为这是一个有趣的问题,起初它让我和几个同事再次猜测自己几分钟.

eri*_*son 9

您将看到greeting匿名Job执行时的值.

final修改只需要局部变量,而不是成员变量.