Ответ 1
Дело в том, что методы-локальные переменные из охватывающего типа на самом деле скопированы на экземпляры анонимных классов (это из-за проблем с кадрами активации, но я не буду углубляться подробно, поскольку это на самом деле не имеет отношения к вопросу), поэтому они должны быть окончательными, потому что переменная в экземпляре вложенного типа больше не то же самое.
Итак, вот первый пример:
void foo() {
int a = 3;
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
Это не компилируется, потому что вы не можете ссылаться на не конечную переменную в методе анонимного класса. Когда вы добавляете окончательный модификатор в объявление a
, значение a
будет скопировано в созданный экземпляр анонимного класса, который вы определили. Однако вам не будет позволено изменять значение a
, потому что изменения не будут видны методу, в котором объявлен a
.
Однако анонимные классы не являются статическими, то есть они имеют ссылку на экземпляр-экземпляр (если только метод, в котором они объявлены, является статическим), который вы можете использовать для изменения переменных охватывающего экземпляра:
int a = 3;
void foo() {
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
В этом примере выполняется компиляция, и при каждом вызове метода run()
экземпляра анонимного класса он будет увеличивать a
на 3 каждый раз. (В этом примере он никогда не вызывается, но это всего лишь пример.)
Итак, чтобы суммировать, вам нужно преобразовать переменную seatno
из локальной локальности метода в переменную экземпляра охватывающего типа. Или, если это так, вам нужно удалить последний модификатор, поскольку конечные переменные могут быть назначены только один раз.
Обновление: В Java 8 вводится концепция эффективных конечных переменных (см. Спецификация Java). Однако в первом примере этого сообщения переменная a
назначается несколько раз, что предотвращает ее окончательную окончательность. Это означает, что этот пример до сих пор не компилируется с Java 8. (Ошибка компиляции: "Локальная переменная a, определенная в охватывающей области, должна быть окончательной или эффективной окончательной" )