Introdução: por que Kotlin parece fácil, mas surpreende
\n\nKotlin é uma linguagem moderna, concisa e incrivelmente conveniente. Muitos iniciantes vêm do Java ou Python e pensam: "Bem, aqui é tudo tão claro!". E de fato, a sintaxe do Kotlin é limpa, os tipos nullable protegem contra NPE, e recursos funcionais como let, apply e run parecem magicamente simples. Mas é justamente essa aparente simplicidade que muitas vezes se torna uma armadilha.
Neste artigo, vamos analisar os erros mais comuns ao aprender Kotlin que os iniciantes cometem. Você aprenderá como evitá-los e receberá exemplos de código prontos. Se você está apenas começando sua jornada no aprendizado de Kotlin para iniciantes, este artigo vai te salvar de muitas horas de depuração.
\n\nErro nº1: Ignorar a null safety ou, ao contrário, ter paranóia
\n\nKotlin incorpora a null safety diretamente no sistema de tipos. Isso é uma bênção, mas os iniciantes frequentemente caem em dois extremos. O primeiro é a ignorância total e o uso do operador !! (not-null assertion) em cada passo. O segundo é o uso excessivo do operador elvis ?: e cadeias de ?.let que transformam o código em uma bagunça ilegível.
Como o erro se parece
\n\n// Ruim: !! total — mata toda a segurança do Kotlin\nfun processUser(user: User?) {\n val name = user!!.name // Se user == null — crash!\n println(name.uppercase())\n}\n\n// Ruim: muitos let aninhados\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\nComo fazer corretamente
\n\n// Bom: usar chamada segura + elvis\nfun processUserSafe(user: User?) {\n val name = user?.name ?: "Convidado"\n println(name.uppercase())\n}\n\n// Ótimo: extensões e funções de escopo sem zoológico de aninhamento\nfun getUserCityClean(user: User?): String? {\n return user?.address?.city?.name\n}\n\n\nDica: Use o operador !! apenas se você tiver 100% de certeza de que o valor não é null (por exemplo, após uma verificação em if). Nos outros casos — ?. e ?:.
Este é um dos principais problemas de iniciantes em Kotlin — eles ou têm medo de null, ou não entendem como trabalhar com ele. Lembre-se: Kotlin não proíbe null, ele te obriga a pensar sobre ele.
\n\nErro nº2: Não entender a diferença entre var, val e constantes
\n\nParece que val é uma variável final, como final em Java. Mas não. val é uma referência somente leitura, não um objeto imutável. Iniciantes frequentemente confundem val com uma constante de tempo de compilação (const val) e se surpreendem quando seu código não funciona como esperado.
Exemplo de confusão
\n\n// Iniciante pensa: "val = imutável"\nval list = mutableListOf(1, 2, 3)\nlist.add(4) // Funciona! Mas o iniciante fica chocado\n\n// Já isso é um erro de compilação\nval name = "Alice"\nname = "Bob" // Erro: val não pode ser reatribuído\n\n\nComo diferenciar
\n\n// Constante de tempo de compilação — apenas para primitivos e String\nconst val PI = 3.14159\n\n// Referência somente leitura — pode ser calculada em runtime\nval currentTime = System.currentTimeMillis()\n\n// Imutabilidade real — use coleções imutáveis\nval immutableList = listOf(1, 2, 3) // listOf, não mutableListOf\n\n\nRegra de ouro: Use val sempre que possível. Se a variável precisar mudar — só então use var. E const val — apenas para constantes de nível superior ou dentro de object/companion object.
Erro nº3: Abusar de companion object e object-singletons
\n\nKotlin oferece uma maneira elegante de criar singletons através de ob