2010-01-20 9 views
6

¿Qué es la variable final? (si escribo final int temp ; en función, ¿cuál es el significado?)
¿Para qué objetivo utilizar la variable final (tanto la variable de clase como la variable de función)?
¿por qué la variable en bloque sincronizado debe declarar final?Bloque variable y sincronizado final en java

+0

última variable no heredan – SjB

+10

@ sb2367: Creo que estás confundiendo con clases finales, lo que puede' t ser subclasificado –

Respuesta

14

Básicamente significa que no puede cambiar el valor. Para las variables de ejemplo, debe asignar cualquier variable final una vez (y solo una vez) en el constructor (o con un inicializador variable). La sincronización es un concepto bastante ortogonal.

La razón principal para hacer una variable local final es para que pueda usarla en una clase interna anónima ... esto no tiene nada que ver con estar en un bloque sincronizado.

las variables

finales son útiles para las clases inmutables, es cierto - y la inmutabilidad hace la vida más fácil en un entorno multi-hilo - pero eso es la única relación entre los dos que se me ocurre ...

EDIT: El comentario de Wildwezyr tiene sentido en términos de no cambiar la variable en la que está sincronizando. Eso sería peligroso, por las razones que le ha dado. ¿Es eso lo que quisiste decir con "variable en bloque sincronizado"?

+2

¿Alguna vez ha visto esta advertencia: "Sincronización en campo no final"? – WildWezyr

+0

@WildWezyr: No lo he hecho, pero entiendo por qué ocurriría. –

+0

Es posible que desee consultar la publicación [aquí] (http://stackoverflow.com/questions/1249917/final-variable-manipulation-in-java?rq=1) para mayor claridad sobre la diferencia pequeña pero significativa entre una versión final objeto y un primitivo final. – HardcoreBro

4

Además de lo que dijo Jon Skeet, el valor no se puede cambiar, pero los contenidos pueden cambiarse.

final Integer one = new Integer(1); 
... 
one = new Integer(2); // compile error 

final List list = new ArrayList(); 
... 
list = new ArrayList(); // compile error 
list.add(1); // Changes list, but that's fine! 

También tenga en cuenta que final y final estático no son lo mismo. final está dentro del alcance de la instancia, mientras que la final estática es la misma para todas las instancias de una clase (en otros idiomas esto podría llamarse una constante).

Personalmente, creo que la ventaja de la final, incluso cuando no es absolutamente necesario para que su software funcione, tiene un significado semántico. Le ofrece la posibilidad de decirle al compilador y a la siguiente persona que trabaja en ese código que esta variable no debe cambiarse, y que intentar cambiarla podría ocasionar un error.

13

Las variables finales y los bloques de códigos sincronizados tienen algo en común ... Si declara la variable no final a y luego escribe synchronized (a) { System.out.println('xxx'); } aparecerá la advertencia "Sincronización en campo no final" - al menos en NetBeans.

¿Por qué no debería estar sincronizando en un campo no final? Porque si el valor del campo puede cambiar, entonces diferentes subprocesos pueden sincronizarse en diferentes objetos (diferentes valores del campo), por lo que no podría haber sincronización (cada subproceso puede ingresar al bloque sincronizado al mismo tiempo).

Mire aquí, por ejemplo, de problemas de la vida real causado por la sincronización en el campo no final: http://forums.sun.com/thread.jspa?threadID=5379204

Cuestiones relacionadas