Has creado una clase interna aquí. Como el tiempo de vida de los objetos de esta clase puede ser potencialmente mucho mayor que el tiempo de ejecución de la invocación del método (es decir, el objeto puede existir mucho después de que el método haya retornado), necesita "preservar" el estado de las variables locales que puede acceder.
Esta preservación se realiza creando una copia (invisible, sintética) dentro de la clase interna y reemplazando automáticamente todas las referencias a la variable local con referencias a esa copia. Este podría provocar efectos extraños cuando la variable local se modifica después de que se creó el objeto de la clase interna.
Para evitar esto, existe el requisito de que todas las variables locales a las que acceda de esta manera son final
: esto garantiza que solo exista un valor posible para la variable local y no se observan incoherencias.
Esta regla específica se pueden encontrar en §8.1.3 Inner Classes and Enclosing Instances de the JLS:
Cualquier variable local, parámetro del método formal o parámetro de gestión de excepciones utilizado pero no declarados en una clase interna debe declararse final. Cualquier variable local, utilizada pero no declarada en una clase interna debe estar definitivamente asignada (§16) antes del cuerpo de la clase interna.
[Acerca de varibles finales locales en Java] (http://stackoverflow.com/questions/3013547/about-local-final-varibles-in-java) –
relacionado http://stackoverflow.com/questions/154314/ when-one-use-final –