Mão no Código

Kotlin e seu Null Safety

Written by Pedro Mendes · 2 min read >
Kotlin

Kotlin é uma linguagem que já esta no mercado há alguns anos, mas foi recentemente anunciada pela Google como uma das linguagens oficialmente suportadas no ambiente de desenvolvimento Android. Resultado? Um boom nas buscas segundo o Google Trends:

Buscas sobre Kotlin no Google Trends
Buscas sobre Kotlin no Google Trends

O que é uma NullPointerException?

Um NullPointerException é um tipo de exceção que ocorre quando um programa tenta acessar ou modificar uma propriedade ou chamar um método em um objeto que é nulo (null) em vez de um objeto válido. Isso geralmente ocorre quando o programa não verifica se um objeto é nulo antes de usá-lo, ou se uma variável foi inicializada como nula sem querer.

Um exemplo simples de como essa exceção pode ser lançada é:

String text = null;
int length = text.length;

Dessa forma a variavel ‘text’ não contém nenhum objeto e o metodo ‘length’ não funcionará, dessa forma ocorre o erro de NullPointerException.

Esse tipo de exceção é considerado particularmente perigoso porque, se não for tratado corretamente, pode causar uma falha no aplicativo.

Algumas linguagens possuem mecanismos de segurança para evitar esse tipo de exceção como o Null safety, que verifica se um valor é nulo antes de permitir que seja acessado, e acusando erro em tempo de compilação.

Como Kotlin resolve NullPointerException

Entre o pacote de motivos pelo qual Kotlin faz “a vida de um desenvolvedor Java ser mais feliz”, um dos pontos mais aclamados é como ela lida com valores nulos, ou seja, sua nullability. Embora nem tudo sejam flores, vamos entender como funciona essa mecânica e como tirar proveito dela.

Null pointer por todo lado

Exemplos

Referências nulas e suas NullPointerExceptions (NPEs) não são coisas boas – tanto que são chamadas de The Billion Dollar Mistake. Então, para começo de conversa, o seguinte trecho de código é completamente ilegal no Kotlin:

fun main(args: Array<String>){
var myVar:String = null;
}
view raw a.kt hosted with ❤ by GitHub

Isso acontece porque por padrão objetos não são nullables, ou em português claro e direto: não recebem null.  O mesmo acontece para argumentos de função:

fun myFunction(name: String){
// name nunca será null. Dentro do escopo desta função
// não há a necessidade de checar se name == null
println(name.length);
}
view raw a.kt hosted with ❤ by GitHub

Nesse ponto você pode estar se perguntando: “mas e se eu quiser valores nulos?”. Você pode explicitamente informar que uma variável é optional (que pode ser nula) durante sua declaração usando o operador ?, como no exemplo:

fun myFunction(){
var myVar:String? = null;
}
view raw a.kt hosted with ❤ by GitHub

Porém ao declarar que algo pode ser nulo, o Kotlin exige que você lide com esse objeto de maneira diferente. Você não pode operar métodos em um objeto optional como faz com os não optional. Por exemplo, isso aqui também é ilegal no Kotlin:

fun myFunction(){
var myVar:String? = null;
// ↓ Você não pode chamar o .length diretamente
var myVarLength:Int = myVar.length;
}
view raw a.kt hosted with ❤ by GitHub

Sempre que precisar acessar métodos em um objeto opcional, use o operador ? antes do método, como no exemplo:

fun myFunction(){
var myVar:String? = null;
var myVarLength:Int? = myVar?.length;
}
view raw a.kt hosted with ❤ by GitHub

Como você pode perceber, eu não posso receber diretamente o retorno de uma operação realizada em um objeto opcional em objeto não opcional – por isso a variável myVarLength também precisa ser opcional. O Kotlin provê o operador ?:  para declarar rapidamente um valor padrão caso o objeto esteja nulo:

fun myFunction(){
var myVar:String? = null;
// Nesse caso,myVarLength será zero.
var myVarLength:Int = myVar?.length ?: 0;
}
view raw a.kt hosted with ❤ by GitHub

Se você tiver que lidar com objetos optionals, o Kotlin permite através do seu Smart Cast um atalho para que você não tenha que ficar usando o operador ? em toda linha: caso seu bloco de código assegure que um objeto não é nulo, você não precisa usar o operador ?. Exemplo:

fun myFunction(){
var myVar:String? ="Hello, World!";
if(myVar != null) {
println(myVar.length);
}
}
view raw a.kt hosted with ❤ by GitHub

Optionals do Kotlin e a tal interoperabilidade com códigos Java

Como lidar no Kotlin ao usar códigos Java, já que Java permite valores nulos em quase tudo? A equipe do Kotlin fez um belo trabalho se preocupando em tratar códigos importados do Java de maneira mais “relaxada”, criando uma categoria especial de tipos chamada platform types. Você não pode criar manualmente objetos com esse tipo, mas eles estão lá sempre que usamos códigos Java.

Com isso, você não precisa ficar usando o operador ? sempre que precisar acessar o objeto. A parte ruim é que neste caso você precisa tomar cuidado com NPEs em runtime, fazendo null check sempre que preciso.

Conclusão

Null safety é só um de muitos outros aspectos positivos da linguagem. Se você já esta usando, deixa ai nos comentários o que tem agradado (ou não). Até a próxima!

With no Python

With no Python

Pedro Mendes in Mão no Código
  ·   6 min read
Construindo Websockets em Go

Websockets em Go

Pedro Mendes in Mão no Código
  ·   3 min read

2 Replies to “Kotlin e seu Null Safety”

  1. o que não gostei do não nulo é o tamanho do arquivo Json, passa a inserir esses campos que antes não iam, mas trabalhar com não nulo seria melhor, hehe

Deixe uma resposta

%d blogueiros gostam disto: