Data Classes: convertendo 30 linhas de código Java para 1 linha em Kotlin

Dessa vez vamos falar um pouco sobre um dos fatores mais interessantes da linguagem Kotlin, uma vez que em qualquer aplicativo é possível tirar vantagem da facilidade com que a linguagem permite a implementação dessa estrutura, as Data Classes.

Data Classes

Em qualquer aplicação, estamos sempre trabalhando com algum domínio, e muitas vezes definimos um POJO (Plain Old Java Object) para representar as informações desse domínio de uma forma estruturada, o que faz com que seja comum códigos encontrarmos códigos como esse:

class Pessoa {
private final String nome;
private final LocalDate dataNascimento;
private String profissao;
    public Pessoa(String nome, LocalDate dataNascimento, 
String profissao) {
this.nome = nome;
this.dataNascimento = dataNascimento;
this.profissao = profissao;
}
    //getters, setters, toString, equals, hashCode
}

Nesse caso, criamos uma classe com alguns atributos, os quais foram encapsulados de modo a seguir o padrão Java Beans (atributos privados expostos por getters e setters).

O problema com esse padrão é fácil de ser identificado: sempre é necessário repetir praticamente o mesmo código para definição de cada propriedade, razão pela qual a maioria das IDE’s permite a geração automática desse tipo de código.

Porém, o fato de que “eu não preciso escrevê-lo” não muda a realidade de que esse código reside em nossa base, e como você já deve ter percebido, quanto maior a base de código, maior a complexidade para modificá-la e adicionar novas funcionalidades.

Ao invés de simplesmente “empurrar a sujeira para debaixo do tapete”, a linguagem Kotlin conta com um tipo de especial de classe chamado “Data Class”. As data classes são utilizadas para representar dados de uma forma estruturada, porém sem a necessidade de se definir getters, setters, toString, equals ou hashCode; todo esse código repetitivo é gerado automaticamente pelo compilador. Veja como representar a mesma classe Pessoa usando Kotlin:

data class Pessoa(val nome: String, val dataNascimento: LocalDate, var profissao: String?)

Como você pode perceber, esse código é muito mais expressivo, e em apenas uma linha de código é possível obter o mesmo resultado de mais de 30 linhas de código Java. Caso você precise alterar a profissão de uma pessoa:

joao.setProfissao("Designer"); //Java :(
joao.profissao = "Designer" //Kotlin :)

O acesso direto à propriedade permitido pela linguagem Kotlin também torna a sintaxe muito mais clara, sem toda a cerimônia “exigida” pelo Java, uma vez que em 99% dos casos, os métodos setters nada mais fazem do que alterar o valor de um atributo.


Ao contrário do exemplo citado, é provável que as suas classes contenham mais de 3 atributos, talvez até mais de 10. Nesses casos você deveria considerar o uso do padrão Builder para a construção desses objetos. A linguagem Kotlin conta com uma Extension Function chamada “apply” em sua biblioteca que permite alterar os atributos de um objeto utilizando padrão bastante similar a um builder:

joao.apply {
filhos = 2
hobbies = "Skate/Música"
empresaEmQueTrabalha = "WerDesigners"
}

Caso você queira saber um pouco mais sobre Extension Functions, você pode ler sobre como eu julgo que elas podem ser úteis aqui.


Whatever the mind can conceive and believe, it can achieve. — Napoleon Hill

Essas são algumas das vantagens de se utilizar Data Classes. Caso tenha gostado dessa postagem, não se esqueça de recomendá-la para que outras pessoas também possam se beneficiar com a leitura. Se quiser aprender um pouco mais sobre a linguagem Kotlin com foco em desenvolvimento de aplicativos android, é só me seguir para acompanhar as próximas postagens.

Até a próxima.