Linguagens da JVM: Kotlin

Atualmente a plataforma Java possui diversas linguagens de programação suportadas pela Java Virtual Machine (JVM). As linguagens criadas podem ser interpretadas pela JVM através de compiladores que geram bytecodes (linguagem intermediária que a máquina virtual entende) ou criando uma engine utilizando a Java Scripting API (definida pela JSR 223).

Apesar de particularmente gostar muito da linguagem Java, acredito ser importante um desenvolvedor conhecer diversas linguagens de programação para que tenha mais opções para atacar problemas que venha a enfrentar.

Pensando em melhorar a produtividade na criação de produtos, a JetBrains (criadora da IDE IntelliJ Idea) criou a linguagem Kotlin e a tornou código aberto para incentivar a comunidade a utilizar. Nesse post irei fazer uma análise rápida da linguagem e apontar pontos que gostei.

“Sem uma língua comum não se podem concluir os negócios.”

Confúcio

História

Segundo a JetBrains o Kotlin começou a ser desenvolvido em 2010 devido a uma percepção da empresa. A JetBrains já desenvolvia em Java a 10 anos e acumulava bastante conhecimento na utilização da plataforma, e sentiram que poderiam aumentar a produtividade do desenvolvimento dos produtos utilizando uma outra linguagem mais moderna. Após avaliarem as opções já existentes, decidiram juntar toda a bagagem e experiência que tinham para criar a tal linguagem.

Características

O Kotlin foi pensado para ser uma linguagem moderna e voltada para a indústria em geral e possui as seguintes características:

  • estaticamente tipado - pensando para projetos de vida longa e que possuem grande crescimento, a linguagem possui tipagem estática que facilita a manutenção de código;
  • fácil migração - integração transparente com a linguagem Java, sendo possível utilizar qualquer framework ou biblioteca existente. Isso facilita muito a migração entre as linguagens, tornando-a suave e natural;
  • pequena curva de aprendizagem - possui sintaxe enxuta e intuitiva, documentação completa, uma ferramenta online para a execução de códigos e exemplos através de exercícios chamados Koans;
  • multi-paradigma - não força o desenvolvedor a utilizar um paradigma específico como o funcional ou orientado a objetos, suportando ambos;
  • compatível com a versão 6 do java - projetos antigos podem se beneficiar de recursos não existentes anteriormente como lambdas e programação funcional;

A linguagem foi criada para ser pragmática na resolução de problemas além de trazer diversas funcionalidades que vemos em outras linguagens modernas.

Configuração e suporte de IDE’s

Existem plugins para o IntelliJ IDEA, Eclipse e Netbeans, mas a configuração é bem simples para qualquer plataforma, basta efetuar o download do compilador e colocar a pasta bin no PATH do sistema (para os sistemas Posix pode-se utilizar o SDKMAN).

Teste do funcionamento do compilador do Kotlin
Teste do funcionamento do compilador do Kotlin

Funcionalidades

O Kotlin possui muitas funcionalidades úteis para o desenvolvedor, mas vou destacar as que mais me chamaram atenção.

Data Classes

Muitas vezes precisamos criar classes anêmicas que só servem para armazenar dados, para esses casos a linguagem fornece o conceito de data classes e para utilizar é só colocar a marcação data na declaração do construtor que faz com que o compilador crie os getters, setters e implemente equals(), hashCode() e toString() para cada propriedade declarada. Segue exemplo:

data class Usuario(val nome: String, val idade: Int)

Essa declaração já é suficiente para criar o seguinte código:

fun main(args: Array<String>) {
    val usuario = Usuario("João", 35)
    val usuario2 = Usuario("Maria", 35)

    println("Nome: ${usuario.nome}")
    println("Idade: ${usuario.idade}")
    println(usuario.toString())
    println("Hashcode: ${usuario.hashCode()}")

    println("Nome: ${usuario2.nome}")
    println("Idade: ${usuario2.idade}")
    println(usuario2.toString())
    println("Hashcode: ${usuario2.hashCode()}")

    println("usuario.equals(usuario2) = ${usuario.equals(usuario2)}")
}

Resultado:

Nome: João
Idade: 35
Usuario(nome=João, idade=35)
Hashcode: 71868978
Nome: Maria
Idade: 35
Usuario(nome=Maria, idade=35)
Hashcode: -1997441011
usuario.equals(usuario2) = false

Muito prático, não?

String Templates

No código de exemplo anterior, você pode ter notado algo diferente ao declarar a escrita de strings na saída do console, caso não segue destaque:

println("Nome: ${usuario.nome}")

Essa é a sintaxe do string templates que permite utilizar expressões ou valores de variáveis sem precisar concatenar sendo, em minha opnião, uma forma mais limpa de declarar strings literais.

Null Safety

Tornar o programa à prova de null é uma boa prática, inclusive existe um padrão para ajudar, o Kotlin ajuda nessa tarefa trazendo para a checagem do compilador a tarefa de verificar se a variável pode ou não conter nulos, exemplo:

val usuario3: Usuario? = Usuario("Pedro", 30)
println(usuario3.nome) //Erro de compilação

Ao declarar usuario3 com a marcação ‘?’, estamos dizendo ao compilador que essa variável pode ter nulos, logo o compilador só irá permitir operações desde que haja uma verificação explícita, corrigindo o código ficaria assim:

val usuario3: Usuario? = Usuario("Pedro", 30)
if (usuario3 != null) {
    println(usuario3.nome) //Agora sim! Compila sem erros
}

Esses foram os pontos que achei mais interessantes da linguagem, mas existem muitos outros que vale a pena citar como o named arguments, compilação para Javascript e a destructuring declaration.

Concluindo

A sintaxe linguagem ajuda a diminuir as linhas de código, não só pelo suporte a programação funcional, mas pelas utilidades apresentadas. Acredito que o objetivo de ser uma linguagem mais prática para o desenvolvedor foi alcançada, principalmente por apresentar muitas facilidades que só encontramos em bibliotecas à parte.

Fonte

Código

Código fonte - https://github.com/ivanqueiroz/kotlin

Escrito em 15 Janeiro de 2017