Son todas las clases finales en Java inmutables. String e Integer son clases finales y ambas son inmutables.¿Todas las clases finales son inmutables?
Respuesta
No, una clase final significa que no puede heredar de ella. No tiene nada que ver con la mutabilidad. La siguiente clase es definitiva pero mutable:
public final class FinalMutable {
int value;
public void setValue(int v) { value=v; }
public int getValue() { return value; }
}
No, final significa que la clase no se puede extender. No dice nada sobre la mutabilidad. Por ejemplo:
final class MutInt {
public int modifyMe;
}
No hay palabras clave para la inmutabilidad, es más como un patrón de diseño.
EDITAR:
Esto significa, no hay palabra clave, que hace que una clase sea inmutable. Para hacer que una clase sea inmutable, debes proteger las partes internas haciéndolas definitivas o privadas.
Lo confuso es esto: la palabra clave final tiene diferentes significados cuando se usa en una clase y luego cuando se usa en un campo/variable. El primero significa "esta clase no se puede extender". El segundo significa "esta variable (o referencia) no puede ser cambiada".
existe la palabra clave "final" para campos y variables, pero no hace que el objeto sea inmutable, solo la referencia. – Rytmis
@Rytmis: Sí, correcto, pero no hay keyowrd que haga que una clase sea inmutable, como java.lang.String. Editaré la respuesta para aclarar esto. –
Y aún más confuso, el uso de campos 'finales' también se ha sobrecargado con semántica específica en el Modelo de memoria de Java (desde 1.5). – Grundlefleck
En relación con las otras respuestas, si nos fijamos en el código para java.lang.String
verá que contiene un campo: hash
, que es mutable y es, de hecho, cuando se calcula y almacena hashCode()
es llamado por primera vez.
Sin embargo, la clase sigue siendo inmutable: no se puede acceder directamente o modificar el campo hash
fuera de la clase.
Además, puede observar que un enfoque común dentro del JDK es la implementación de envolturas inmutables que se pueden usar para exponer el estado interno de un objeto sin permitir que se modifique; p.ej.
private final List<String> values;
public List<? get String> getValues() {
return Collections.unmodifiableList(values);
}
Y, lo que es crucial para la seguridad del hilo, la asignación diferida del campo hash es una carrera de datos * benigna *. Si no fuera así, dos usuarios de hashCode(), en diferentes subprocesos, podrían ver dos valores diferentes. – Grundlefleck
Como se ha dicho por los demás antes de final
no hace imuutable clase en Java pesar de que juega un papel en la estrategia de la inmutabilidad. Para obtener la inmutabilidad debe seguir las actuales directivas generales:
- asegurar la clase no puede ser invalidado - hacer que la clase
final
o utilice fábricas estáticas y mantener constructores privados - crea campos
private
yfinal
- fuerza de las personas que llaman construir un objeto completamente en un solo paso, en lugar de utilizar un constructor sin argumentos combinado con llamadas posteriores a los métodos
setXXX
(es decir, evitar la convención de Java Beans) - no proporciona ningún método que pueda cambiar el estado del objeto t de ninguna manera - no sólo
setXXX
métodos, pero cualquier método que puede cambiar de estado - si la clase tiene ningún campo de objetos mutables, entonces deben ser copiados a la defensiva cuando se pasa entre la clase y su llamador
+ agregar un administrador de seguridad ¡deshabilite cambiar la bandera accesible usando el reflejo! –
Una cosa más: asegúrese de hacer copias defensivas de cualquier argumento mutable en los constructores. Esto está cubierto en Effective Java, 2nd Ed., Item # 15 –
Ahh sí Acabo de buscar el elemento # 15-> 5, pero el punto real se hace en el elemento # 39 para constructores y el elemento # 76 para los métodos 'readObject' –
El no se puede acceder al campo privado por los métodos reemplazados de la subclase ... Así que no hay manera de que los métodos de la subclase cambien el campo privado de la superclase ... Entonces, ¿de qué sirve hacer que la clase inmutable sea definitiva?
Las palabras clave finales evitan que las otras clases lo hereden. La palabra clave final no la hace inmutable, pero existen condiciones tales como hacer que los miembros de la clase de instancia sean privados y definitivos y usar getters y no usar setters
- 1. ¿Por qué todas las clases anónimas son implícitamente finales?
- 2. ¿Cuáles son las clases internas finales?
- 3. ¿Las clases de envoltura de Java son realmente inmutables?
- 4. ¿Las cadenas StringBuilder son inmutables?
- 5. Clases inmutables en C++
- 6. ORM apoyo a las clases inmutables
- 7. ¿Las cadenas de Delphi son inmutables?
- 8. Java: variables finales en las clases abstractas
- 9. jQuery objeto son inmutables?
- 10. ¿Las clases internas son livianas?
- 11. ¿Cuáles son las ventajas reales de las colecciones inmutables?
- 12. ¿Por qué todas las colecciones base inmutables son definitivas o selladas en scala?
- 13. Java: método de pseudo-setter para las clases inmutables
- 14. ¿Qué son los objetos inmutables?
- 15. ¿Los objetos inmutables son una buena práctica?
- 16. Jackson JSON, clases inmutables e interfaces
- 17. creando todas las clases desde sencha sdk
- 18. Resharper- Encuentra todas las clases no utilizadas
- 19. Obteniendo todas las clases internas por reflexión
- 20. Obteniendo todas las clases de un paquete
- 21. Eclipse ¿Reemplazar texto en todas las clases?
- 22. Importar todas las clases en el directorio?
- 23. ¿Son varias las clases de DataContext apropiadas?
- 24. Pasar variables finales a clases anónimas
- 25. 'copia' para las clases que no son de casos?
- 26. ¿Qué son las clases S1 y S2?
- 27. ¿Las clases de Java son objetos?
- 28. ¿Son posibles matrices inmutables en .NET?
- 29. ¿Por qué los objetos Joda son inmutables?
- 30. C# - ¿son todas las constantes de Enum?
Para que la clase sea inmutable, tengo que eliminar el setter() método fuera de la clase y también hacer que su variable de instancia (que en este caso es "valor") final. ¿Estoy correcto ...? – Gourav
Sí, debe eliminar el colocador y hacer que el "valor" sea el definitivo. –
Para agregar a eso, Rytmis hace un buen punto a continuación. Si el valor es un objeto mutable, ¿su objeto es realmente inmutable? Lo mejor es hacer que el valor sea privado y cambiar getValue para hacer una copia defensiva. –