Kotlin, nulos e o ponto de exclamação duplo: introdução
\n\nVocê já escreveu em Kotlin, o compilador reclamou de um potencial null, e você respondeu colocando dois pontos de exclamação — !! — e seguiu em frente? Se sim, você já conhece o herói do nosso artigo — o operador double bang (também conhecido como operador !! em Kotlin).
Este símbolo é ao mesmo tempo um salvador e uma ferramenta perigosa. Ele diz ao compilador: "Cale a boca, eu sei o que estou fazendo, esta variável definitivamente não é null". Mas se você estiver errado — o aplicativo cairá com um NullPointerException. Parece assustador? Na verdade, é apenas um mecanismo poderoso que você precisa entender e usar com sabedoria.
Neste guia, vamos explorar o que é double bang Kotlin, como ele funciona, onde usá-lo e onde é melhor procurar alternativas. Você aprenderá como não dar um tiro no próprio pé e escrever código confiável.
\n\nO problema que o !! resolve: Null Safety em Kotlin
\n\nKotlin foi criado como uma linguagem que deveria matar o NullPointerException (NPE). E ele quase conseguiu. Em Kotlin, os tipos por padrão não podem ser null. Você simplesmente não pode atribuir null a uma variável do tipo String — o compilador não permite.
var name: String = "Alice"\nname = null // Erro de compilação!\n\n\nMas o mundo real é cheio de incertezas. Os dados vêm do banco de dados, do usuário, da rede. Por isso, Kotlin introduziu tipos nullable — tipos que podem ser null. Eles são indicados por um ponto de interrogação: String?.
var nullableName: String? = "Bob"\nnullableName = null // Agora é permitido\n\n\nE aqui começa a mágica. Você não pode simplesmente chamar um método em uma variável nullable:
\n\nval length = nullableName.length // Erro! "Only safe (?.) or non-null asserted (!!.) calls are allowed"\n\n\nKotlin força você a lidar com null. Isso é genial — você não esquece de verificar. Mas às vezes você sabe com certeza que o valor não é null. E é aí que entra em cena o operador de ponto de exclamação duplo Kotlin.
O que é o operador !! (double bang)?
\n\nO operador !! em Kotlin é o operador de afirmação forçada non-null. Ele pega um valor nullable e o converte em um tipo non-null. Se o valor for null — é lançado um KotlinNullPointerException.
Sintaticamente, ele aparece como dois pontos de exclamação após a variável:
\n\nval nonNullValue = nullableValue!!\n\nComo funciona na prática
\n\nImagine que você tem uma função que busca um usuário por ID. Ela retorna User?, porque o usuário pode não existir. Mas você sabe com certeza que no seu ambiente de teste o usuário com ID = 1 existe.
data class User(val name: String)\n\nfun findUser(id: Int): User? {\n // Alguma lógica de busca\n return if (id == 1) User("Ana") else null\n}\n\nfun main() {\n val user = findUser(1)\n // Temos certeza que user não é null\n val userName = user!!.name\n println(userName) // Imprime: Ana\n}\n\n\nNeste exemplo, o double bang Kotlin funcionou corretamente e obtivemos o nome. Mas se o ID fosse 2, o aplicativo cairia com uma exceção.
\n\nQuando usar !! (e quando é categoricamente proibido)
\n\nO operador !! (double bang) é como um botão vermelho. Você pode apertá-lo, mas apenas se tiver 146% de certeza. Vamos analisar os cenários legítimos.
\n\nQuando pode (e deve) usar !!
\n\n- \n
- Interação com código Java. Java não conhece anotações nullable. Se um método Java retorna um objeto, Kotlin o vê como um
Platform Type(por exemplo,String!). Você pode tratá-lo como quiser. Mas e