ProgramaciónDesarrollador Android / Desarrollador Backend

¿Cómo funciona la inicialización de valores constantes (const val) y constantes de tiempo de compilación en Kotlin? ¿Cuál es la diferencia con el val normal, qué limitaciones hay, cómo se utiliza para anotaciones y por qué no siempre se puede usar const val donde se desee?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En Kotlin, la palabra clave const val se utiliza para declarar constantes de tiempo de compilación, es decir, valores que son conocidos y calculados en el momento de la compilación.

  • const val solo está disponible para variables de nivel superior, o para propiedades declaradas en objetos object o companion object.
  • El valor debe ser de tipos: String, primitivos numéricos o Boolean.
  • Se utiliza para anotaciones y decoradores, donde el valor debe ser reemplazado en el momento de la compilación.

val es una variable inmutable, pero el valor puede ser asignado durante la ejecución, lo que permite cálculos o llamadas a funciones durante la inicialización:

val timestamp = System.currentTimeMillis() // Esto NO es const val const val APP_NAME = "MyApp" // Esta es una constante de tiempo de compilación

En las anotaciones, solo se puede usar const val, ejemplo:

const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Example

Si se intenta usar val en estos casos, habrá un error de compilación.


Pregunta capciosa

¿Por qué no se puede declarar const val dentro de una clase normal?

Respuesta: Porque const val requiere que la variable sea accesible en el momento de la compilación, mientras que las variables de instancia de la clase se inicializan solo en el momento de la creación del objeto, por lo que no pueden ser constantes de tiempo de compilación.

class Example { // ¡Error! No se puede hacer así // const val CLASS_NAME = "MyClass" }

Historia

La compilación falló porque un desarrollador intentó pasar un valor calculado en tiempo de ejecución a través de una anotación.

El desarrollador declaró:

val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App

El proyecto no se compiló, ya que solo se puede usar const val en los argumentos de las anotaciones.


Historia

Error en Android: intento de usar variables locales como claves constantes en Intent.

class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)

En algunas herramientas o frameworks se espera const val, y no un val normal; de lo contrario, la IDE o los recursos de Android no ven estos valores como constantes de tiempo de compilación.


Historia

Uso de un tipo inapropiado para const val.

const val LIST = listOf(1,2,3) // ¡Error! Solo se permiten primitivos y String.

El desconocimiento de las limitaciones de tipo llevó a un error de compilación y pérdida de tiempo.