В 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
в какой-то момент в будущем. Это работает, потому что анонимным классам разрешено ссылаться на конечные переменные во внешней области видимости.
В чем я не уверен, так это в следующем случае:
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
таким, каким оно было при создании задания или во время его выполнения? Я думаю, что знаю ответ, но я подумал, что это интересный вопрос, и поначалу он заставил меня и пару коллег задуматься на несколько минут.