El gran 'problema' con el multihilo, y también la razón por la que se usa, es que varias cosas están sucediendo al mismo tiempo. De repente, el valor de cualquier variable a la que acceda el hilo que no sea local al hilo puede cambiar en cualquier momento. Por lo tanto, es posible que sólo estás impresión de los números 1-10 con este código:
int x = 0; //supposing that this was allowed to be non-final...
private class myRun implements Runnable{
@Override
public void run() {
for (int i=0; i<10; i++) {
System.Out.Println(x++);
}
}
}
Pero en realidad, si otro código en esa clase cambia el valor de x, que podría terminar la impresión 230498-230508 .El valor de x podría cambio de evento en el medio de su ciclo. Si no puede confiar en x
que tiene un cierto valor o mantener el valor que le asignó anteriormente, se vuelve inútil usarlo en su código. ¿Por qué usarías una variable si su contenido pudiera cambiar con un simple golpe?
En lugar de solo prohibirte usarlo, Java requiere que lo hagas final
. Podrías simplemente 'prometer' nunca cambiar el valor de x
de otro hilo, pero ¿por qué no hacerlo final
en primer lugar y dejar que el compilador te ayude?De acuerdo, solo puede acceder al valor inicial asignado al x
, pero el solo hecho de poder acceder al valor inicial de la variable es mejor que no poder usarlo en absoluto, lo que efectivamente cortaría la capacidad del subproceso para utilizar los datos del resto de tu clase
Porque así es como se define el idioma. Presumiblemente para mantener las * variables * modificadas dentro de dicho método en la * clase interna anónima *. (Creo que también simplifica la implementación: solo los * valores * necesitan ser copiados de manera proxy en el tipo anónimo y las variables originales ya no deben mantenerse, como sería necesario con la semántica de cierre completo). –
Si esto no era el caso, sus variables podrían modificarse en cualquier momento sin previo aviso. – jahroy