Kotlin ou Java?

Façam suas apostas, #timekotlin ou #timejava, quem vencerá essa disputa? Como sabemos, oficialmente Kotlin foi anunciado no Google I/O deste ano, e nessa disputa o nosso velho conhecido Java agora dividirá espaço no desenvolvimento Android.

Neste artigo descreverei as principais diferenças da linguagem Kotlin em relação ao Java, demonstrando as principais características, aplicações e recursos. A maioria dos desenvolvedores Android hoje utilizam Java, apesar do sistema Android também possuir suporte a linguagens C/C++.

Kotlin é uma linguagem que está sendo comparada ao Java assim como Swift foi comparada ao Objective-C, e revela-se como uma alternativa aos desenvolvedores Android.

O que é Kotlin?

É uma linguagem estaticamente tipada, desenvolvida pela JetBrains, com uma sintaxe mais expressiva e concisa do que Java, pois a linguagem é baseada no jeito programação funcional de ser e possibilita a construção de códigos mais elegante do que outras linguagens.

Kotlin roda sobre uma JVM e possui 100% de compatibilidade com a linguagem Java. Segundo os autores a linguagem foi planejada como uma alternativa ao desenvolvimento Java com o objetivo de fazer códigos mais enxutos e elegantes.

Quer conhecer um pouco mais sobre a história de Kotlin? Confira alguns links abaixo.


Características Kotlin

Algumas características interessantes que ainda não são encontrados em Java e outras linguagens são a interoperabilidade, ser multi-paradigma, segura e expressiva.

Interoperabilidade

Permite a migração de Java para Kotlin e vice-versa naturalmente. Códigos e bibliotecas 100% compatíveis entre Java e Kotlin.

Multi-paradigma

É multi-paradigma justamente para não obrigar o desenvolvedor utilizar um paradigma específico como orientado a objetos ou funcional, suporta os dois. A linguagem usa muitos conceitos funcionais, como expressões lambda para resolver alguns problemas de maneira muito mais fácil.

Segura

Tem seguro contra valores nulos, valida valores nulos em tempo de compilação, para evitar exceções em tempo de execução.

Expressiva

Você pode escrever mais com muito menos código.

Vantagens Kotlin vs Java

Por conta da linguagem Kotlin ser influenciada por outras como Java, Scala, Groovy, C# e Gosu, encontramos recursos diferenciados nela que a tornam elegante escrevendo pouco mas fazendo muito.

Proteção Contra Nulo (Null Safety)

Quem já não teve problemas com variáveis de valores nulos? Kotlin possui uma solução bem simples para os conhecidos NullPointerException em Java que aqui serão chamados simplesmente de NPE.

// Java
String a = "kotlin"
a = null // ok
...
// Kotlin
var
a: String = "kotlin"
a = null // erro de compilação

Em muitos casos esta proteção pode ser muito importante para garantir uma segurança ao seu código. E nativamente o Kotlin oferece essa possibilidade. Para forçar o uso de valores nulos você precisa chamar o operador String? para permitir valores nulo.

// Kotlin
var
a: String? = "kotlin"
a = null // ok

Outra funcionalidade atraente é a chamada segura de valores nulo utilizando o mesmo operador ? em variáveis.

// Java
int
l = (a != null)? a.length : 0
...
// Kotlin
val
l = a?.length

Lambdas

As expressões lambda em particular seguem o paradigma Programação Funcional (o termo em si vem do Cálculo Lambda, fundação matemática que sustenta esse paradigma. Expressões deste tipo são cercadas por aparelhos de proteção, seus parâmetros (se houver) são declarados antes -> (os tipos de parâmetros podem ser omitidos), ou o corpo segue depois -> (quando presente).

// Java
TextView textView = (TextView) findViewById(R.id.text_view);
textView.setOnClickListener(v -> System.out.println("Long Click"));
...
// Kotlin
textView.setOnClickListener(view -> println("Long Click"))

Existem muitos exemplos de como utilizar expressões lambda em diferentes situações, recomendo este link sobre function e lambda na página oficial do Kotlin, onde é possível encontrar vários exemplos.

Classes de Dados (Data Classes)

Toda aplicação orientada a objetos, por exemplo, necessita de uma classe de dados para armazenamento. Estas classes são acompanhadas por métodos set/get de cada atributo. A diferença é extremamente grande entre Java e Kotlin.

// Java
class User{
 private String name;
private int age;
 void setAge(int age){
this.age = age;
}
 void setName(String name){
this.name = name
}
 void getAge(){
return age;
}
 void getName(){
return name;
}
}
...
// Kotlin
data
class User(var name: String, var age: Int)

Variáveis e Imutabilidade

Variáveis definidas como var são mutáveis (Leitura e Escrita)

Variáveis definidas como val são imutáveis (Somente Leitura) semelhantes ao uso do modificador final no Java.

// Java
final View
view; // Valor inalterado uma vez iniciado
final TextView txt; // Valor inalterado uma vez iniciado
int x = 0; // O tipo é explicitamente declarado
x = 1; // O compilador permite alterar o valor inicial
...
// Kotlin
val
view: View // Valor inalterado uma vez iniciado
val txt: TextView // Valor inalterado uma vez iniciado
var x = 0 // O tipo é inferido automaticamente 'Int'
x = 1 // O compilador permite alterar o valor inicial

Outras formas de declarar inicializando uma variável:

// Java
String
name = "Java"; // declaração com o tipo explícito
...
// Kotlin
var
name: String = "Kotlin" // após o nome do atributo declaramos o tipo semelhante ao Java
var name = "Kotlin" // Caso o tipo não seja declarado o mesmo é inferido

Argumentos padrões

Com este recurso podemos predefinir valor a um atributo, por exemplo:

// Java
// aqui a alternativa é utilizar o padrão Builder
class ToastBuilder{
 private String msg;
private int duration;
 public ToastBuilder(){}
 public ToastBuilder message(String msg){
this.msg = msg;
return this;
}
 public ToastBuilder duration(int duration){
this.duration = duration;
return this;
}
 public Toast buildToast(){
return Toast.makeText(getApplicationContext(), msg, duration);;
}
}
...
// Kotlin
// declaração de método
fun Activity.toast(message: String, duration: Int = Toast.LENGTH_LONG){
Toast.makeText(this,message,duration).show()
}
// construtor de um classe
class Contact(val email: String, val active: Boolean = true)

Desta maneira, o uso do método se torna mais simples, permitindo repassar apenas 1 parâmetro se necessário.

// Java
Toast t1 = new ToastBuilder().message("Hello Java").buildToast();
Toast t2 = new ToastBuilder()
.message("Hello Java")
.
duration(Toast.LENGTH_SHORT)
.buildToast();
...
// Kotlin
toast("Hello Kotlin")
//ou
toast("Hello Kotlin" , Toast.LENGTH_SHORT)

Strings

Agora você pode concatenar strings de maneira mais simples.

// Java
System.out.println(“A view " + view + " tem visibilidade " + view.getVisibility() + ".");
...
// Kotlin
println(“A view $view tem visibilidade ${view.visibility}.")

Para descobrir mais recursos consulte String interpolation dentro da documentação oficial.

Algumas Mudanças

Como já sabemos a definição de classes dentro do Java por padrão são públicas permitindo a herança por qualquer outra classe subsequente. Já em Kotlin a definição é diferente, todas as classes definidas com o operador class recebem a proteção para não permitir a extensão por outra classe. Para permitir o uso da herança você precisa utilizar o operador open class.

// Java
public class Student{
...//pode ser extendida
}
private class Student{
...// não pode ser extendida
}
...
// Kotlin
class Student{
... //não pode ser extendida
}
open class Person{
...//pode ser extendida
}

Conclusão

Sem dúvida Kotlin é uma rica linguagem com um arsenal imenso de recursos, posso dizer até páreo ao Java, pois como verificamos muitas técnicas feitas em Java no Kotlin são compatíveis e até de uma maneira mais simples.

Então você me pergunta, o que eu faço agora? Dediquei anos da minha vida para aprender Java, quer dizer que vai ser descontinuado? Talvez, isso o futuro poderá dizer.

A verdade é de que você precisa estar por dentro das mudanças e estar atento ao mercado, pois um dia a linguagem pode se tornar a número 1 do desenvolvimento Android. Mas enquanto esse dia não chegar, se prepare desde agora pois nunca é tarde.

Gostou do artigo? Compartilhe com os amigos e redes sociais, da um like no artigo, ajuda a divulgar o material :). E não esquece de seguir lá no LinkedIn e Github

Referências