Kotlin const vs val: ¿cuál es la diferencia y qué elegir?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Kotlin const vs val: ¿cuál es la diferencia y qué elegir?

\n\n

¿Estás escribiendo código en Kotlin y de repente te preguntas: «¿Cuál es la diferencia entre const y val? Ambos parecen inmutables, ¿verdad?». ¡Excelente pregunta! Este aspecto confunde incluso a desarrolladores experimentados que vienen de Java u otros lenguajes. No es de extrañar que en Stack Overflow el tema «What is the difference between "const" and "val"?» acumule miles de visitas. Hoy vamos a aclarar este asunto de una vez por todas, desglosando la teoría y respaldándola con ejemplos de código en vivo.

\n\n

¿Listo? ¡Allá vamos!

\n\n

Breve introducción: ¿qué es val?

\n\n

Empecemos por lo más simple. val (de la palabra value — valor) es una referencia inmutable. Puedes asignarle un valor una sola vez y nunca más cambiarlo. ¿Te suena familiar? Sí, es el equivalente de final en Java o readonly en C#.

\n\n
val name: String = "Alicia"\nname = "Bob" // ¡Error de compilación! Val cannot be reassigned
\n\n

Pero hay un matiz importante: val garantiza que la referencia no cambiará, pero no garantiza la inmutabilidad del objeto en sí. Si usas val con una lista mutable (MutableList), aún puedes agregar y eliminar elementos.

\n\n
val numbers = mutableListOf(1, 2, 3)\nnumbers.add(4) // ¡Funciona!\n// numbers = mutableListOf(5, 6) // ¡Error! No se puede reasignar la referencia
\n\n

val puede inicializarse tanto en el momento de la declaración como más tarde en el código (por ejemplo, en el constructor o en un bloque init). Su valor se calcula durante la ejecución del programa (runtime).

\n\n

¿Y qué es const? El estricto guardián del tiempo de compilación

\n\n

const es el hermano más estricto de val. También es inmutable, pero con una supercapacidad: el valor debe conocerse en tiempo de compilación (compile-time). En otras palabras, es una constante real que el compilador puede insertar directamente en el código, como una función incorporada.

\n\n

const tiene reglas estrictas:

\n
    \n
  • Solo puede declararse a nivel de archivo (fuera de una clase) o dentro de un object / companion object.
  • \n
  • Debe ser de tipo primitivo o de tipo String.
  • \n
  • No puede ser el resultado de una llamada a función o un cálculo; solo un literal u otra constante.
  • \n
\n\n
// Correcto\nconst val PI = 3.14159\nconst val APP_NAME = "MiApp"\n\n// Incorrecto\nconst val currentTime = System.currentTimeMillis() // ¡Error! El valor no se conoce en tiempo de compilación\nconst val userName = getName() // ¡Error! No se permite llamada a función
\n\n

Principales diferencias: const vs val en tabla

\n\n

Para que sea visual, aquí tienes una tabla comparativa:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Criterioconst valval
Momento de inicializaciónEn tiempo de compilaciónEn tiempo de ejecución
Dónde se puede declararNivel superior, object, companion objectEn cualquier lugar (dentro de una clase, función, constructor)
Tipos de datosSolo primitivos y StringCualquier tipo (incluyendo objetos, listas)
RendimientoMáximo (inline)Estándar
Uso en anotacionesSíNo
\n\n

Ejemplo práctico: anotaciones y rendimiento

\n\n

Uno de los usos más

Blogs

Book Recommendations