На мой взгляд, доступ к локальным переменным из локальных классов метода (например, анонимного класса) является рискованным делом. Это разрешено компилятором, но требует хорошего понимания происходящего.
Когда создается экземпляр внутреннего класса, все ссылки на локальные переменные, которые он использует, копируются и передаются как неявные параметры конструктора (проверьте байт-код). На самом деле компилятор мог бы разрешить делать ссылки не окончательными, но это могло бы сбить с толку, поскольку неясно, что произойдет, если метод изменяет ссылки после создания экземпляра.
Однако, окончательное определение ссылки не устраняет все проблемы. Несмотря на то, что ссылка является неизменной, объект за ссылкой может быть изменяемым. Любые мутации объекта, сделанные между созданием экземпляра внутреннего класса до его активации, будут видны внутренним классом, и иногда это не является намерением программиста.