Есть несколько тем в переполнении стека по ошибке компилятора Cannot refer to a non-final variable message inside an inner class defined in a different method
, и решение "объявляет его окончательным, и все готово", но с этим теоретическим вопросом я хотел бы проверить, что является логической причиной, почему код не может компилироваться:
private void updateStatus(String message) {
Runnable doUpdateStatus = new Runnable() {
public void run() {
/* do something with message */
}
}
/* do something with doUpdateStatus, like SwingUtilities.invokeLater() */
}
(решение: объявить message
как final), тогда как это делает:
private String enclosingClassField;
private void updateStatus() {
Runnable doUpdateStatus = new Runnable() {
public void run() {
/* do something with enclosingClassField */
}
}
/* do something with doUpdateStatus, like SwingUtilities.invokeLater() */
}
Я действительно смущен. enclosingClassField
не является окончательным, он может меняться каждый раз много раз, тогда как слабый аргумент message
updateStatus
может меняться только внутри его тела метода и вместо этого обвиняется компилятором;)
Даже ошибка компилятора вводит меня в заблуждение. Cannot refer to a non-final variable message inside an inner class defined in a different method
: В отличие от чего? Разве не message
определяется тем же методом, что и внутренний класс? Разве не enclosingClassField
определяется вне метода? Эмм...
Может ли кто-нибудь указать мне на правильную интерпретацию этого вопроса? Спасибо.