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