¿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
Respuesta
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 variablesfinales 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"?
¿Alguna vez ha visto esta advertencia: "Sincronización en campo no final"? – WildWezyr
@WildWezyr: No lo he hecho, pero entiendo por qué ocurriría. –
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
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.
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
- 1. Bloque sincronizado - Java
- 2. Bloque sincronizado de Java para .class
- 3. bloque sincronizado de Java vs. Collections.synchronizedMap
- 4. ¿Cuál es la diferencia entre un método sincronizado y un bloque sincronizado en Java?
- 5. ¿por qué usar volátiles con bloque sincronizado?
- 6. variable estática final en Java
- 7. Java: esperando en el bloque sincronizado, ¿quién va primero?
- 8. Código inesperado en el bloque sincronizado
- 9. código de ejemplo para mostrar cómo funciona java bloque sincronizado
- 10. ¿Puedo usar sincronizado con un campo final?
- 11. ¿Qué significa "sincronizado" en Java?
- 12. Cuándo usar sincronizado en Java
- 13. java: cómo declarar final una variable que se inicializa dentro de un bloque try - catch?
- 14. clase interna variable no final java
- 15. ¿Cómo funciona el trabajo sincronizado en Java
- 16. final y estática en Java
- 17. java sincronizado en el método ¿No funciona?
- 18. Comentario de Java al final de la llave/bloque
- 19. java herramienta de claves dando "bloque final no rellena correctamente"
- 20. Advertencia variable de bloque de captura en Java
- 21. Asignar última variable en un bloque try
- 22. En Java, el valor de retorno dentro del bloque sincronizado parece un mal estilo. ¿Realmente importa?
- 23. variable final estática pública en una clase java importada
- 24. Inicializar la variable final antes del constructor en Java
- 25. Alcance de la variable local final en java
- 26. matriz final en Java
- 27. Cambiar instrucción e inicializar una variable estática final en el bloque estático
- 28. Asignación de un objeto dentro de un bloque sincronizado sobre la base de ese objeto (Java)
- 29. Java: ¿qué sucede cuando se inicia un nuevo subproceso desde un bloque sincronizado?
- 30. bloque final dado no rellena correctamente
última variable no heredan – SjB
@ sb2367: Creo que estás confundiendo con clases finales, lo que puede' t ser subclasificado –