A menudo he visto los términos immutabley los he constusado indistintamente. Sin embargo, según mi (poca) experiencia, los dos difieren mucho en el 'contrato' que hacen en el código:
Immutable hace que el contrato indique que este objeto no cambiará (p. Ej., Tuplas de Python, cadenas de Java).
Const hace el contrato de que en el alcance de esta variable no se modificará (no se promete lo que otros hilos podrían hacer al objeto señalado durante este período, por ejemplo, la palabra clave C / C ++).
Obviamente, los dos no son equivalentes, a menos que el lenguaje sea de un solo hilo (PHP), o tenga un sistema de tipeo lineal o uniforme (Clean, Mercury, ATS).
Primero, ¿es correcto mi comprensión de estos dos conceptos?
En segundo lugar, si hay una diferencia, ¿por qué se usan casi exclusivamente como sinónimos?
fuente

constno existe en todos los idiomas, y la mutabilidad e inmutabilidad no existe en todos los idiomas, por lo que hacer que este lenguaje sea agonístico no es aplicable. Es específico del idioma solo donde se aplican estos conceptos.Respuestas:
Hablaré con C ++, donde esta diferencia es más relevante.
Como observa correctamente, inmutable significa que un objeto no puede cambiar en absoluto después de su creación. Por supuesto, esta creación puede ocurrir en tiempo de ejecución, es decir, un
constobjeto no es necesariamente una constante de tiempo de compilación. En C ++, un objeto es inmutable si se cumplen (1) y (2) o (3):No tiene miembros declarados
mutableque estén mutados porconstfunciones miembroSe declara
constconstlas funciones de miembro no se utilizanconst_castpara eliminar laconstcalificación con el fin de mutar a cualquier miembroSin embargo, también podría considerar modificadores de acceso: si una operación muta internamente una instancia, pero no tiene ningún efecto sobre el estado de la instancia observable a través de su interfaz pública, entonces el objeto es "lógicamente inmutable".
Por lo tanto, C ++ proporciona las herramientas necesarias para crear objetos inmutables, pero como la mayoría de todo en C ++, las herramientas son mínimamente suficientes y requieren diligencia para su uso real. El estado de una instancia no se limita necesariamente a las variables miembro de la instancia, ya que C ++ no proporciona una forma de imponer la transparencia referencial, también puede incluir el estado global o de clase.
constTambién tiene otra función en C ++: calificar referencias y punteros. Unaconstreferencia puede referirse a un noconstobjeto. Es legal (aunque generalmente no es necesario o aconsejable) usarconst_castpara mutar un objeto a través de unaconstreferencia, si y solo si ese objeto se declara noconst:Y, por supuesto, es un comportamiento indefinido mutar un
constobjeto:fuente
Hablando para Java donde la palabra clave "final" representa "const", considere:
Esto significa
someoneque NUNCA puede referirse a otro objeto Persona. Pero, aún puede cambiar los detalles de la persona que se refiere. P.ejsomeone.setMonthlySalary(10000);Pero, si
someonefuera un objeto "Inmutable", uno de los siguientes sería verdadero: (a) No tendría un método llamadosetMonthlySalary(b) Llamar a setMonthlySalary siempre arrojaría una excepción comoUnsupportedOperationExceptionfuente
Los objetos inmutables son aquellos que no cambian de estado después de crearlo. Por ejemplo;
En este ejemplo, el objeto myComplexStr es inmutable pero no constante porque se calcula su valor. Y es inmutable porque es una cadena y tiene una propiedad de longitud estática y no puede cambiar.
Los objetos Const generalmente se usan para identificar algunas constantes reales cuyos valores se conocen antes de la compilación como Pi, "USA", "StackOverflow.com", números de puerto, etc.
Desde esta perspectiva, Const es diferente de los objetos inmutables porque el programa no calcula sus valores.
Pero si está hablando de la palabra clave "const" en C ++, puede decir que "const" se usa para crear objetos inmutables.
fuente
constsimilar es un comportamiento indefinido, sin importar dónde esté asignado, IIRC. Y el comportamiento indefinido es peor que cualquier error específico garantizado. Significa que ya no usa C ++: C ++ no proporciona medios para cambiar unconstvalor (excepto losmutablemiembros, por supuesto, pero ese no es su punto), por lo que en lo que respecta a C ++, no puede hacerlo. Lo que las implementaciones específicas permiten es otra cosa completamente distinta (y apuesto a que si compilas con optimizaciones, el truco que realizaste no afectará las expresiones posteriores que utilicespiporque ha sido sustituido).Sí, pero su segunda pregunta muestra que no comprende estas diferencias.
consten C ++ solo se usa para el nivel de acceso (significa "solo lectura") , no para inmutabilidad. Implica que el acceso en sí está totalmente separado de los datos. Por ejemplo, podría manipular algunos datos y luego exponerlos a través de una referencia constante. El acceso es de solo lectura, pero los datos en sí, ya que todos los datos son mutables.const solo garantiza las limitaciones de acceso, mientras que la inmutabilidad (como en D por ejemplo) no implica realmente ninguna forma de cambiar los datos en cualquier etapa de la vida del objeto .
Ahora, puede simular la inmutabilidad en C ++ asegurándose de que no se pueda acceder a algunos datos de otra manera que no sea const y asegurarse de que se inicializan y ya no se tocan. Pero esa no es una garantía sólida, ya que los lenguajes como D le dan cuando marca sus datos como inmutables. El lenguaje asegura que no es posible realizar ninguna operación que modifique esos datos, mientras que en C ++ aún puede cambiar los datos a través de la conversión continua y la mutabilidad si es realmente necesario.
Al final, no es lo mismo ya que no ofrece las mismas garantías.
fuente
Hablando de JavaScript, las palabras clave
constyObject.freezeconstse aplica a las fijacionesvariables. Crea un enlace inmutable, no puede asignarle un nuevo valor.Object.freezetrabaja en valores de objeto. Hace que un objeto sea inmutable . Es decir, no puede cambiar sus propiedades.fuente
En C ++ son iguales. Aunque puede cambiar un
constobjeto si tiene su ubicación en la memoria y el permiso del sistema operativo para escribir en esa memoria.fuente
En C, C ++ y lenguajes relacionados, también hay una diferencia entre un objeto que está en constante y su referencia o puntero al objeto que es una referencia constante.
Si intenta modificar un objeto constante, obtiene un comportamiento indefinido. (Puede intentar modificar un objeto constante, por ejemplo, tomando su dirección, convirtiendo la dirección en un puntero no constante y luego utilizando ese puntero no constante para modificar el objeto).
El puntero o referencia constante, por otro lado, solo le dice al compilador que no puede usar este puntero o referencia para modificar el objeto. Puede lanzar el puntero o la referencia e intentar modificar el objeto. Si el objeto en sí era constante, sucederán cosas malas. Si el objeto no era realmente constante, cambiará. Por supuesto, esto puede confundir a los usuarios de su código y posiblemente causar errores.
En C, si utiliza un literal de cadena como "Hola", los cinco caracteres y los bytes cero finales son realmente constantes, pero obtiene un puntero no constante. Muy mala idea usar ese puntero no constante para cambiar el objeto.
En C, puede tener un puntero "const restrict". Eso significa que el objeto señalado es temporalmente constante. Si el objeto se modifica por cualquier medio mientras el puntero "const restrict" está dentro del alcance, obtendrá un comportamiento indefinido. Esto es más fuerte que un puntero constante que solo le impide cambiar un objeto a través de este puntero.
fuente