En la programación orientada a objetos, el cadena u objetos inmutables que no se puede modificar una vez creado. Pero sólo podemos cambiar la referencia al objeto. Nos limitamos a cambiar el objeto en sí. El La cadena es inmutable en Java debido a la seguridad, sincronización y concurrencia, almacenamiento en caché y carga de clases. La razón para hacer que la cadena sea definitiva es destruir la inmutabilidad y no permitir que otros la extiendan.
Los objetos String se almacenan en caché en el grupo String y esto hace que Cadena inmutable . Varios clientes acceden a los literales de cadena almacenados en caché. Por lo tanto, siempre existe el riesgo de que la acción realizada por un cliente afecte a todos los demás clientes. Por ejemplo, si un cliente realiza una acción y cambia el valor de la cadena de Presión a PRESIÓN, todos los clientes restantes también leerán ese valor. Por razones de rendimiento, el almacenamiento en caché de los objetos String era importante, por lo que para eliminar ese riesgo, tenemos que hacer que String sea inmutable.
Estas son algunas razones más para hacer que String sea inmutable:
- El grupo de cadenas no puede ser posible si String no es inmutable en Java. Se ahorra una gran cantidad de espacio en el montón JRE . Más de una variable de cadena en el grupo puede hacer referencia a la misma variable de cadena. La pasantía de cadenas tampoco puede ser posible si la cadena no fuera inmutable.
- Si no hacemos que la cadena sea inmutable, supondrá una grave amenaza a la seguridad de la aplicación. Por ejemplo, los nombres de usuario y las contraseñas de la base de datos se pasan como cadenas para recibir conexiones de la base de datos. El programación de sockets Las descripciones de host y puerto también se pasan como cadenas. La cadena es inmutable, por lo que su valor no se puede cambiar. Si el String no permanece inmutable, cualquier hacker puede causar un problema de seguridad en la aplicación al cambiar el valor de referencia.
- El String es seguro para subprocesos múltiples debido a su inmutabilidad. Diferentes subprocesos pueden acceder a una única 'instancia de cadena'. Elimina la sincronización para la seguridad de subprocesos porque implícitamente hacemos que las cadenas sean seguras para subprocesos.
- La inmutabilidad brinda la seguridad de cargar la clase correcta mediante Classloader. Por ejemplo, supongamos que tenemos una instancia en la que intentamos cargar la clase java.sql.Connection pero los cambios en el valor referenciado a la clase myhacked.Connection hacen cosas no deseadas en nuestra base de datos.
Entendamos el concepto de inmutable a través de un ejemplo.
ImmutableString.java
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } }
Producción:
imagen como fondo en css
Descripción: Podemos entender el ejemplo anterior con la ayuda del siguiente diagrama:
En el grupo constante de cadenas, el Hola permanece sin cambios y se crea un nuevo objeto de cadena con Hola Mundo . Muestra que las cadenas son inmutables. La variable de referencia apunta a la Hola no al Hola Mundo.
Si queremos que se refiera a la Hola Mundo , tenemos que asignarlo explícitamente a esa variable. Por ejemplo:
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } }
Producción: