Constantes en Kotlin: ¿cómo crearlas correctamente? Guía completa

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

Constantes en Kotlin: deja de adivinar, empieza a usarlas correctamente

\n\n

Si llevas escribiendo en Kotlin al menos una semana, seguro que ya te has enfrentado a la pregunta: "¿Cómo declaro correctamente una constante?" Parece sencillo — existe val, existe const val, existe companion object. Pero el diablo, como siempre, está en los detalles. Y esta pregunta en Stack Overflow ha acumulado miles de visitas por una razón.

\n\n

Aclaremos de una vez por todas qué formas de crear constantes existen en Kotlin, cuándo usar cada una, y por qué val no siempre es una constante. ¡Allá vamos!

\n\n

1. val vs const val: ¿cuál es el truco?

\n\n

La pregunta más común de los principiantes: "Escribí val — ¿eso es una constante?" Respuesta: sí y no.

\n\n

val es una referencia inmutable (solo lectura). Pero el valor se calcula en tiempo de ejecución. Es decir, no es una constante en tiempo de compilación.

\n\n
// Esto NO es una constante en tiempo de compilación\nval currentTime = System.currentTimeMillis()
\n\n

const val es una constante real que se incrusta en el código en la fase de compilación (como static final en Java).

\n\n
// Esto sí es una constante\nconst val PI = 3.14159
\n\n

Limitación importante: const val solo se puede usar con tipos primitivos y String. Nada de objetos, listas o clases personalizadas.

\n\n
\n

💡 Regla de oro: Si el valor se conoce en tiempo de compilación — usa const val. Si se calcula en tiempo de ejecución — usa val.

\n
\n\n

2. ¿Dónde declarar constantes? Top 3 formas

\n\n

Forma 1: Constantes top-level (recomendada)

\n\n

La forma más simple y limpia — declarar la constante en el nivel superior del archivo. Sin clases, sin objetos — solo un archivo con constantes.

\n\n
// Constants.kt\nconst val BASE_URL = "https://api.example.com"\nconst val TIMEOUT_SECONDS = 30\nconst val APP_NAME = "MyKotlinApp"
\n\n

¿Por qué es genial?

\n
    \n
  • Mínimo código
  • \n
  • Accesible desde cualquier lugar sin prefijos
  • \n
  • El compilador incrusta los valores
  • \n
  • Fácil de refactorizar
  • \n
\n\n

Forma 2: companion object dentro de una clase

\n\n

El enfoque clásico de Java que se trasladó a Kotlin. Úsalo cuando las constantes estén lógicamente relacionadas con la clase.

\n\n
class NetworkClient {\n    companion object {\n        const val DEFAULT_PORT = 8080\n        const val PROTOCOL = "https"\n    }\n}\n\n// Uso\nval port = NetworkClient.DEFAULT_PORT
\n\n

Inconveniente: ruido sintáctico. Ventaja: las constantes están vinculadas al contexto.

\n\n

Forma 3: object (singleton) para grupos de constantes

\n\n

Cuando hay muchas constantes y es necesario agruparlas por significado.

\n\n
object AppConstants {\n    const val MAX_LOGIN_ATTEMPTS = 5\n    const val SESSION_DURATION = 3600L\n    const val DATE_FORMAT = "yyyy-MM-dd"\n\n    object Urls {\n        const val LOGIN = "/auth/login"\n        const val LOGOUT = "/auth/logout"\n    }\n}\n\n// Uso\nAppConstants.Urls.LOGIN
\n\n

3. Constantes en Android: particularidades

\n\n

Si programas para Android, hay algunos matices adicionales.

\n\n

Constantes en companion object y @JvmStatic

\n\n

Para que una constante de companion object sea realmente estática en Java (por ejemplo, para anotaciones), usa @JvmStatic:

\n\n
class MyFragment : Fragment() {\n    companion object {\n        @JvmStatic\n        const val ARG_ID = "id"\n    }\n}
\n\n

Constantes en recursos

\n\n

No olvides la forma clásica de Android — los recursos. Para cadenas, colores, dimensiones:

\n\n
// strings.xml\n<string name="app_name">MyApp</string>\n\n// En código\nval appName = getString(R.string.app_name)
\n\n

Pero esto no son constantes en tiempo de compilación.

Blogs

Book Recommendations