El punto es que las variables del método local del tipo envolvente son en realidad copian a instancias de clases anónimas (esto se debe a de los problemas del marco de activación, pero no profundizaré en los detalles ya que esto no es realmente relevante para la pregunta), por lo que deben ser definitivos, porque la variable en la instancia de tipo anidado ya no es la misma.
lo tanto, aquí es el primer ejemplo:
void foo() {
int a = 3;
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
Esto no compila, porque no se puede hacer referencia a una variable no-final en un método de clase anónima. Cuando agrega un modificador final a la declaración de a
, el valor de a
se copiará en la instancia creada de la clase anónima que ha definido. Sin embargo, no se le permitirá cambiar el valor de a
, porque los cambios no serían visibles para el método donde se declaró a
.
Sin embargo, las clases anónimas no son estáticos, es decir, tienen una referencia a la instancia que encierra (a menos que el método en el que se declaran es estática) que se puede utilizar para modificar las variables de la instancia adjuntando:
int a = 3;
void foo() {
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
Este ejemplo se compila y aumentaría a
por 3 cada vez que se llama al método run()
de la instancia de la clase anónima. (En este ejemplo nunca se llama, pero es solo un ejemplo.)
Por lo tanto, para resumir, debe convertir la variable seatno
de una variable de método local a una variable de instancia del tipo adjunto.O, si aún es así, debe eliminar el modificador final ya que las variables finales solo se pueden asignar una vez.
Actualización: En Java 8, se introduce el concepto de variables de eficacia finales (ver Java Language Specification). Sin embargo, en el primer ejemplo de esta publicación, la variable a
se asigna varias veces, lo que impide que sea efectivamente definitiva. Esto significa que este ejemplo aún no compila con Java 8. (El error de compilación es "La variable local definida en un ámbito envolvente debe ser definitiva o efectivamente definitiva")
su variable 'seatno' tiene la palabra clave final en el mismo. –