Introducción: por qué Kotlin parece fácil, pero da sorpresas
\n\nKotlin es un lenguaje moderno, conciso e increíblemente conveniente. Muchos principiantes vienen de Java o Python y piensan: «¡Bueno, aquí todo está claro!». Y ciertamente, la sintaxis de Kotlin es limpia, los tipos nullable protegen contra NPE, y las características funcionales como let, apply y run parecen mágicamente simples. Pero es precisamente esta aparente simplicidad la que a menudo se convierte en una trampa.
En este artículo, analizaremos los errores más comunes al aprender Kotlin que cometen los principiantes. Aprenderá cómo evitarlos y obtendrá ejemplos de código listos para usar. Si recién está comenzando su camino en el aprendizaje de Kotlin para principiantes, este artículo le ahorrará muchas horas de depuración.
\n\nError n.º 1: Ignorar la seguridad contra nulos o, por el contrario, tener paranoia
\n\nKotlin incorpora la seguridad contra nulos directamente en el sistema de tipos. Esto es una bendición, pero los principiantes a menudo caen en dos extremos. El primero es la ignorancia total y el uso del operador !! (aserción not-null) a cada paso. El segundo es el uso excesivo del operador Elvis ?: y cadenas de ?.let que convierten el código en una mezcla ilegible.
Cómo se ve el error
\n\n// Mal: !! total — mata toda la seguridad de Kotlin\nfun processUser(user: User?) {\n val name = user!!.name // Si user == null — ¡crash!\n println(name.uppercase())\n}\n\n// Mal: demasiados let anidados\nfun getUserCity(user: User?): String? {\n return user?.let {\n it.address?.let { addr ->\n addr.city?.let { city ->\n city.name\n }\n }\n }\n}\n\n\nCómo hacerlo correctamente
\n\n// Bien: usamos llamada segura + Elvis\nfun processUserSafe(user: User?) {\n val name = user?.name ?: "Invitado"\n println(name.uppercase())\n}\n\n// Excelente: extensiones y funciones de ámbito sin zoológico de anidación\nfun getUserCityClean(user: User?): String? {\n return user?.address?.city?.name\n}\n\n\nConsejo: Use el operador !! solo si está 100% seguro de que el valor no es null (por ejemplo, después de una comprobación en un if). En otros casos, use ?. y ?:.
Este es uno de los principales problemas de los principiantes en Kotlin: o le temen a null o no entienden cómo trabajar con él. Recuerde: Kotlin no prohíbe null, le obliga a pensar en él.
\n\nError n.º 2: No entender la diferencia entre var, val y constantes
\n\nParece que val es una variable final, como final en Java. Pero no. val es una referencia de solo lectura, no un objeto inmutable. Los principiantes a menudo confunden val con una constante en tiempo de compilación (const val) y se sorprenden de que su código no funcione como esperan.
Ejemplo de confusión
\n\n// El principiante piensa: "val = inmutable"\nval list = mutableListOf(1, 2, 3)\nlist.add(4) // ¡Funciona! Pero el principiante se sorprende\n\n// Esto ya es un error de compilación\nval name = "Alice"\nname = "Bob" // Error: val no puede ser reasignado\n\n\nCómo diferenciarlos
\n\n// Constante en tiempo de compilación — solo para primitivos y String\nconst val PI = 3.14159\n\n// Referencia de solo lectura — puede calcularse en tiempo de ejecución\nval currentTime = System.currentTimeMillis()\n\n// Verdadera inmutabilidad — use colecciones inmutables\nval immutableList = listOf(1, 2, 3) // listOf, no mutableListOf\n\n\nRegla de oro: Use val siempre que sea posible. Si la variable debe cambiar, entonces use var. Y const val solo para constantes de nivel superior o dentro de object/companion object.
Error n.º 3: Abuso de companion object y singletons con object
\n\nKotlin ofrece una forma elegante de crear singletons a través de ob