java - que - public static final
Palabra clave final de Java para variables (6)
¿Cómo la palabra clave final
no hace una variable inmutable? Wikipedia dice que no.
Aunque no se recomienda, Java permite modificar las variables finales utilizando la reflection .
En Java, el término final se refiere a referencias, mientras que inmutable se refiere a objetos. Asignar el modificador final
a una referencia significa que no puede cambiar para apuntar a otro objeto, pero el objeto en sí puede modificarse si es mutable.
Por ejemplo:
final ArrayList<String> arr = new ArrayList<String>();
arr.add("hello"); // OK, the object to which arr points is mutated
arr = null; // Not OK, the reference is final and cannot be reassigned to
Como lo menciona el artículo de Wikipedia, si viene de C ++, debe disociar el concepto de const
en final
e inmutable.
Lee el resto del artículo de Wikipedia:
Para ilustrar que la finalidad no garantiza la inmutabilidad: supongamos que reemplazamos las tres variables de posición con una sola: posta pública final; donde pos es un objeto con tres propiedades pos.x, pos.y y pos.z. Entonces no se puede asignar pos, pero sí las tres propiedades, a menos que sean definitivas.
Para primitivas como int, double, char
etc., funciona más como se podría esperar.
private final int status = 10;
status = 20; // WONT COMPILE because status is final
Supongamos que usted ha declarado que myList es final. Aún puede agregar nuevos elementos a myList, por lo que su estado NO es inmutable. Lo que no puede hacer, debido a la palabra clave final, es cambiar myList para referirse a una lista diferente.
porque si una referencia es definitiva, aún puede cambiar las cosas en el objeto al que apunta la referencia. Usted simplemente no puede cambiar la referencia.