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