A menudo he visto los términos immutable
y los he const
usado 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
const
no 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
const
objeto 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
mutable
que estén mutados porconst
funciones miembroSe declara
const
const
las funciones de miembro no se utilizanconst_cast
para eliminar laconst
calificació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.
const
También tiene otra función en C ++: calificar referencias y punteros. Unaconst
referencia puede referirse a un noconst
objeto. Es legal (aunque generalmente no es necesario o aconsejable) usarconst_cast
para mutar un objeto a través de unaconst
referencia, si y solo si ese objeto se declara noconst
:Y, por supuesto, es un comportamiento indefinido mutar un
const
objeto:fuente
Hablando para Java donde la palabra clave "final" representa "const", considere:
Esto significa
someone
que 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
someone
fuera 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 comoUnsupportedOperationException
fuente
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
const
similar 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 unconst
valor (excepto losmutable
miembros, 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 utilicespi
porque ha sido sustituido).Sí, pero su segunda pregunta muestra que no comprende estas diferencias.
const
en 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
const
yObject.freeze
const
se aplica a las fijacionesvariables
. Crea un enlace inmutable, no puede asignarle un nuevo valor.Object.freeze
trabaja 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
const
objeto 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