viernes, 21 de octubre de 2016

¿Por qué String es Inmutable en JAVA?

El tipo de dato String es Inmutable(es decir que no puede ser modificada) porque cualquier objeto String creado es almacenado en un espacio de memoria llamado String pool. Y ya que las literales tipo String son compartidas entre múltiples clientes siempre existe un riesgo donde alguna de las acciones de un cliente puede afectar a otro.
Por ejemplo, si uno de los clientes cambia el valor del String "Test" a "TEST", el resto de los clientes también verían ese valor como se explicó anteriormente.

Debido a que mantener en memoria los objetos de tipo String es importante por razones de performance, este riesgo se evita haciendo la clase String Inmutable. Al mismo tiempo, String es de tipo final así nadie puede comprometer la inmutabilidad ya sea extendiendo o sobreescribiendo sus comportamientos. Otra razón por la que la clase String es inmutable puede ser debido al uso de HasdMap.

Ya que las variables de tipo String son muy populares como llaves al usar HashMap, es importante que estas sean inmutables de esta manera esas llaves pueden devolver el valor del objeto que se ha almacenado en el HashMap. Ya que HashMap trabaja bajo el principio de Hashing, el cual requiere que el valor se mantenga para funcionar adecuadamente. Un tipo String Mutable, produciría dos diferentes hashcodes al tiempo de la inserción y retorno si el contenido de los Strings fuera modificado después de la inserción, lo que llevaría potencialmente a la pérdida de los objetos valor en el Map.

Si eres un fan del cricket, entonces serás capaz de relacionar mi siguiente frase. El string es VVS Laxman de Java, o sea una clase muy muy especial. No he visto un solo programa de Java que sea escrito sin usar String, Esa es la razón por la cual un sólido conocimiento de String es muy importante para un Desarrollador Java.

La importancia y popularidad de String como tipo de dato, objeto de transferencia y mediador ha lo ha hecho tan popular en entrevistas de Java. ¿Por qué String es inmutable en Java? es una de las preguntas más frecuentemente utilizadas en las entrevistas, lo que inicia con una discusión sobre, qué es String, cómo es la String en Java diferente de String en C y C++, y luego cambiando hacia qué es un objeto inmutable en Java, cuáles son los beneficios de los objetos inmutables, por qué los usarías y en cuáles escenarios los usarías. Entre estas preguntas algunas veces se pregunta, ¿Por qué String es final en Java?.

En una nota similar, si tu te estás preparando para hacer entrevistas sobre Java, te recomiendo que eches un vistazo al libro Java Programming Intervied exposed, un excelente recurso para programadores Java Senior y nivel medio. Ya que contiene preguntas de todos los temas más importantes en Java como multithreading, collections, GC, JVM internals y frameworks como Spring y Hibernate,


¿Por qué String es Final en Java?


Como dije, puede haber múltiples posibles respuestas a esta pregunta, y el único diseñador de esta clase puede responderla con seguridad. Esperaba alguna pista en el libro de Joshua Bloch's Effective Java, pero el tampoco lo mencionó. Yo creo en las siguientes dos razones que tienen mucho sentido de por qué String es una clase hecha Inmutable o fina en Java:

1) Imagina el String pool sin hacer String inmutable, no es posible del todo porque en el caso de que un objeto string contenido en el pool esté referenciado a diferentes referencias de variable, entonces si alguna de ellas cambia el valor, entonces las otras de manera automática se ven affectadas.

Digamos

String A = "Test"
String B = "Test"

Ahora la llamada a String B, "Test".toUpperCase() cambiará el mismo objeto a "TEST". entonces A también será "TEST" lo que no es deseable. Aquí hay un diagrama que muestra como las literales String son creadas en el espacio de memoria y el String literal pool.


Why String is Immutable or Final in Java


2)String ha sido ampliamente utilizado como parámetro para muchas clases de Java, por ejemplo para abrir conexiones de red, tú puedes pasar el hostname y el número de puerto como String, puedes pasar la URL de la base de datos para abrir una conexión o puedes abrir un archivo en Java pasando el nombre del archivo como argumento a las clases I/O de Java.

En el caso de que String no fuera inmutable, esta sería una seria amenaza a la seguridad, quiero decir que alguien podría acceder a cualquier archivo para el cual el tiene autorización y entonces cambiar el nombre del archivo ya sea deliberada o accidentalmente y obtener acceso a ese archivo. Debido a la inmutabilidad, no necesitas preocuparte de ese tipo de amenazas. Esta razón también responde a ¿Por qué String es final en Java? Haciendo final a String, el diseñador de Java se asegura que nadie puede sobreescribir ningún comportamiento en la clase String.

3) Ya que String es inmutable puede ser compartido de forma segura entre varios hilos lo cual es muy importante en la programación multihilos, y para evitar cualquier problema de sincronización en Java. Inmutabilidad, también hace que las instancias String sean thread-safe en Java, eso significa que no necesitas sincronizar las operaciones con String externamente. Otro punto importante sobre String es la pérdida de memoria por Substring, el cual no es un problema relacionado a los hilos, pero es algo de lo que hay que tener cuidado.

4) Otra razón de ¿Por qué String es inmutable en Java? es permitir a String mantener en cache su hashcode, siendo inmutable String en Java mantiene su hashcode en cache, y esto no se calcula cada vez que llamamos al método hashcode de String, lo que lo hace muy rápido de usar como llave en el hashmap de Java. Esto es también sugerido por Jaroslav Sedlacek en los comentarios. En resumen debido a que String es inmutable, nadie puede cambiar su contenido una vez creado lo cual garantiza que el hashcode sea el mismo en diferentes invocaciones.

5) Otra buena razón de Por qué es String Inmutable en Java es la sugerida por Dan Bergh Johnsson en los comentarios: La razón más importante es que es usada por el mecanismo de carga de clases, y de ahí que

***El Artículo fue obtenido de JavaRevisited y fue modificado ligeramente para su traducción. Para revisar el contenido original dar clic aquí.



    Choose :
  • OR
  • To comment
No hay comentarios:
Write comentarios