Pregunta

¿Qué es una variable final en Java? Por ejemplo: si escribo final int temp; en función de lo que es el significado de la palabra clave final
? Además, cuando iba a querer usar última variable (tanto como una variable de clase y como una variable de función)?
¿Por qué variables deben en un bloque sincronizado ser declaradas final?

¿Fue útil?

Solución

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

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

variables finales son útil 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: comentario de Wildwezyr tiene sentido en términos de no cambiar la variable sobre la que está sincronizando . Eso sería peligroso, por las razones que le ha dado. Es eso lo que quiere decir con "variable en bloque sincronizado"?

Otros consejos

variables finales y bloques de código sincronizado tienen algo en común ... Si se declara a variable no final y luego synchronized (a) { System.out.println('xxx'); } escritura obtendrá advertencia "de sincronización en el campo no final." - al menos en NetBeans

¿Por qué usted no debería estar sincronizando en el campo no final? Porque si el valor del campo puede cambiar, a continuación, diferentes hilos pueden ser de sincronización sobre objetos diferentes (diferentes valores del campo) -. Lo que podría haber ninguna sincronización en absoluto (cada hilo puede entrar bloque sincronizado al mismo tiempo)

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

Además de lo que Jon Skeet dijo, el valor no se puede cambiar, pero el contenido puede ser cambiado.

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 estática final no son los mismos. última está dentro del alcance de la instancia, mientras que static final es el mismo para todas las instancias de una clase (en otros idiomas este podría ser llamada una constante).

En lo personal creo que la ventaja de final, incluso cuando no es absolutamente necesario para obtener su trabajo de software, tiene el significado semántico. Se le ofrece la posibilidad de decir que el compilador y la siguiente persona que trabaja en ese código que esta variable no está destinado a ser cambiado, y que intentar cambiarla podría resultar en un error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top