Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Susana83 en 27 de Agosto 2011, 00:14
-
Hola de nuevo, ¿alguien me puede explicar el significado de esta expresión:
"En Java, un String es un objeto inmutable"
Gracias como siempre
-
Esta cuestión puede parecer más sencilla de lo que aparenta. Comencemos por la definición de un String como objeto. En Java, las variables pueden ser dos tipos:
a) Variables que referencian a objetos: la variable no contiene la información, sino referencia al lugar de memoria donde se encuentra la información.
b) Variables que almacenan tipos primitivos (como int, char, boolean, etc.)
Un String o cadena de caracteres en Java tiene un tratamiento de objeto, se asimila a un array de caracteres. No es un tipo primitivo.
Si no tienes muy clara la diferencia entre tipo primitivo y objeto, digamos que el tipo primitivo es algo simple como un número y el objeto algo complejo como un listín de teléfonos. No tomes lo que acabo de decir al pie de la letra porque no es así exactamente, trata solo de servir como ejemplo...
-
¿Qué ocurre si el String es una sola letra? Es tipo primitivo o objeto?
-
Un String es siempre un objeto: su contenido puede ser vacío, es decir, "", puede ser una letra como "a", dos letras como "ak" o una cadena con o sin espacios como "perro" o "esta noche hay luna llena". En todos los casos, son objetos.
-
Si no me he perdido: un carácter es una letra y es tipo primitivo. Y un String puede ser una letra y no ser tipo primitivo. ¿Cuál es la diferencia? Porque digo yo que una letra siempre es una letra. Si yo digo simplemente: "es una letra" ¿Cómo sé si es tipo primitivo o String?
-
Hola Susana, efectivamente una letra siempre es una letra. Pero míralo de otra manera: imagínate que tú tienes una manzana. Si me entregas esa manzana "suelta" en la mano, yo veo directamente que es una manzana, es algo "simple".
Ahora, si esa manzana la metes dentro de una caja y me entregas la caja, yo no veo qué es lo que lleva dentro. Digamos que es algo "complejo" (un objeto). Entonces la caja puede llevar una letra, y ser simplemente una letra dentro de una caja, pero es distinto si te entrego una caja que si te entrego una manzana. Entre otras cosas, no te resulta igual de fácil ver lo que es ni te requiere el mismo espacio de almacenamiento.
En resumen, una letra es una letra. Si va como tipo primitivo, considera que va "suelta". Si va como objeto, considera que va en una caja. En esencia es lo mismo (una letra), pero presentan diferencias.
-
Hola, creo que la diferencia entre objeto y tipo primitivo me queda más o menos clara, pero sigo sin entender qué significa lo de inmutable... Gracias por la ayuda.
-
Veamos el significado de inmutable, que no es precisamente sencillo de explicar. Consideremos que un objeto ocupa un espacio de memoria. Ahora diremos que hay dos tipos de objetos:
a) Objetos mutables: son aquellos cuyo espacio de memoria puede ser reemplazado por un contenido definido con posterioridad a la creación del objeto. En este caso, cuando usamos métodos modificadores es el objeto original el que sufre el cambio.
b) Objetos inmutables: son aquellos cuyo espacio de memoria permanece ocupado con el objeto tal y como se creó inicialmente. ¿Significa esto que no podemos usar métodos modificadores? No, no significa eso. Significa que cuando usamos métodos modificadores en vez de redefinirse el objeto original, la variable apuntadora pasa a apuntar a un nuevo objeto que se crea, permaneciendo el original en su espacio de memoria, podemos decir que en algunos casos “inaccesible”, pero estando.
En Java, la mayoría de los objetos "esenciales" son inmutables: Long, Integer, Boolean, String, , etc. Un objeto se considera inmutable si su estado no puede cambiarse luego de ser construido. Este comportamiento está ampliamente aceptado como una estrategia robusta para crear código simple y confiable. La inmutabilidad se considera efectiva en aplicaciones concurrentes (hablamos de concurrencia para referirnos a dos tareas que transcurren durante el mismo intervalo de tiempo) donde la mutabilidad (cambiar los objetos su estado), podría dar lugar a que los objetos se corrompieran o llegaran a tener un estado inconsistente.
Nosotros en principio no debemos preocuparnos por el costo de crear nuevos objetos frente a actualizar el mismo objeto. En general usar objetos inmutables es eficiente y solo en casos muy específicos tendríamos que preocuparnos por soluciones que ahorraran la multiplicación de objetos.
Aunque no “nos preocupemos” por ella, sí es deseable que tengamos el concepto de inmutabilidad claro.
-
A ver si lo entiendo. En un programa java en el que yo modifique decenas de veces un objeto inmutable, se me quedan decenas de objetos por ahí flotando, inaccesibles... y si son inaccesibles para qué los quiero?
-
Yo creo que lo tienes bien entendido: quererlos no los quieres para nada, pero estar están ahí... Es en cierto modo ineficiente pero mejor una pequeña ineficiencia que una inconsistencia o errror.