Вы создали внутренний класс здесь.Поскольку время жизни объектов этого класса потенциально может быть намного больше времени выполнения вызова метода (т. Е. Объект может существовать еще долго после возврата метода), ему необходимо «сохранить» состояние локальных переменных, которое онможет получить доступ.
Это сохранение выполняется путем создания (невидимой, синтетической) копии внутри внутреннего класса и автоматической замены всех ссылок на локальную переменную ссылками на эту копию.Это может привести к странным эффектам, когда локальная переменная была изменена после создания объекта внутреннего класса.
Чтобы избежать этого, существует требование, чтобы все локальные переменные, к которым вы обращаетесь таким образом, былиfinal
: это гарантирует, что существует только одно возможное значение для локальной переменной, и несоответствия не наблюдаются.
Это конкретное правило можно найти в §8.1.3 Внутренние классы и вложенные экземпляры из JLS :
Любая локальная переменная, параметр формального метода или параметр обработчика исключений, используемые, но не объявленные во внутреннем классе, должны быть объявлены как окончательные.Любая локальная переменная, используемая, но не объявленная во внутреннем классе, должна быть определенно назначена (§16) перед телом внутреннего класса.