Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicacoes android
4 de May de 2018•0 gostou
0 gostaram
Seja o primeiro a gostar disto
mostrar mais
•395 visualizações
visualizações
Vistos totais
0
No Slideshare
0
De incorporações
0
Número de incorporações
0
Baixar para ler offline
Denunciar
Software
Este artigo aborda a linguagem Kotlin, sua utilização no desenvolvimento de aplicativos Android e as principais características que a fizeram ser escolhida pela Google como alternativa ao Java para o desenvolvimento de aplicativos Android.
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicacoes android
Estudo Comparativo das linguagens Kotlin e Java no
Desenvolvimento de Aplicac¸˜oes Android
´Edipo da Silva Souza1
, Marum Sim˜ao Filho1
1
Centro Universit´ario 7 de Setembro (UNI7)
Fortaleza – CE – Brasil
edipo2s@gmail.com, marum@uni7setembro.edu.br
Abstract. At the last annual development conference hosted by Google, the Ko-
tlin programming language was introduced as the first official Java alternative
in the development of android applications. Attentive to this innovation, this
article discusses the Kotlin language, its use on Android and the main features
that made it chosen by Google as an alternative to Java in Android application
development. A brief comparison between the Kotlin and Java languages is pro-
vided. Finally, a simple application was built as a case study, presenting some
facilities of the new language.
Resumo. Na ´ultima conferˆencia anual de desenvolvimento apresentada pela
Google, a linguagem de programac¸˜ao Kotlin foi introduzida como a primeira
alternativa oficial ao Java no desenvolvimento de aplicativos Android. Atento
a esta inovac¸˜ao, este artigo aborda a linguagem Kotlin, sua utilizac¸˜ao no An-
droid e as principais caracter´ısticas que a fizeram ser escolhida pela Google
como alternativa ao Java para o desenvolvimento de aplicativos Android. Um
breve comparativo entre as linguagens Kotlin e Java ´e fornecido. Por fim, um
aplicativo simples foi constru´ıdo a t´ıtulo de estudo de caso, apresentando algu-
mas facilidades da nova linguagem.
1. Introduc¸˜ao
Android ´e um sistema operacional idealizado para ser utilizado em dispositivos m´oveis
com tela sens´ıvel ao toque. Foi inicialmente desenvolvido pela Android Inc., a qual pos-
teriormente foi adquirida pela Google em 2005. Em outubro de 2008, juntamente com o
lanc¸amento do Android Market, ´e ent˜ao lanc¸ado o HTC Dream, tamb´em conhecido como
G1, o primeiro dispositivo comercial a utilizar o sistema da Google. [Wilson 2008]
Apesar de ter seu n´ucleo desenvolvido em C e C++, o Android utiliza-se de uma
m´aquina virtual chamada Dalvik, mais tarde substituida pela Android Runtime (ART),
para carregar suas aplicac¸˜oes, bibliotecas e frameworks do sistema, normalmente escritos
em Java. Contudo tamb´em ´e poss´ıvel utilizar C ou C++ no desenvolvimento de aplicac¸˜oes
atrav´es do NDK, um conjunto de ferramentas que faz uso da tecnologia Java Native In-
terface (JNI). [Google 2009]
Em 23 de setembro de 2008, trˆes anos ap´os a assumir o desenvolvimento do sis-
tema, a Google ent˜ao lanc¸a a vers˜ao 1.0 do Android, e no mˆes seguinte, juntamente com
a Open Handset Alliance, um grupo com atualmente formado por 84 empresas de tec-
nologia e comunicac¸˜ao, torna-o um projeto Open Source mantido sobre licenc¸a Apache.
[Google 2007]
Durante anos, o desenvolvimento de aplicac¸˜oes Android era feito oficialmente
apenas utilizando a linguagem de programac¸˜ao Java. Contudo, no Google IO 2017, con-
ferˆencia anual da Google para desenvolvedores, foi anunciado o suporte ao Kotlin como
sendo a segunda linguagem oficial de desenvolvimento Android. [Titus 2017]
Kotlin ´e uma linguagem de programac¸˜ao estaticamente tipada para a Java Virtual
Machine (JVM) e teve seu desenvolvimento iniciado em 2010, sendo apresentada pela
JetBrains em 2011 na JVM Language Summit [Jemerov 2011]. Em fevereiro de 2012
tornou-se uma linguagem de c´odigo aberto sob Licenc¸a Apache 2, bem como seu compi-
lador, bibliotecas de extenc¸˜ao de classes b´asicas do Java, suas ferramentas de build e o
plugin para a Integrated Development Environment (IDE) IntelliJ. [Oreshnikova 2012]
Pela alta popularidade do Java e sua aplicac¸˜ao em m´ultiplos contextos de de-
senvolvimento atrav´es da utilizac¸˜ao de uma JVM para abstrair informac¸˜oes pertinen-
tes ao ambiente onde o software est´a sendo executado, um dos principais objetivos da
criac¸˜ao da linguagem Kotlin foi desenvolver uma linguagem concisa, produtiva e se-
gura de se utilizar, como alternativa ao Java aproveitando a infraestrutura da sua JVM
[Jemerov and Isakova 2017]. Por conta disto, o compilador do Kotlin gera um byteCode
capaz de ser executado pela JVM, o qual, por sua vez, ´e utilizado pelas ferramentas de
compilac¸˜ao de aplicac¸˜oes Android para gerar um novo byteCode a ser executado pela
m´aquina virtual Dalvik ou ART. [Google 2017]
Somente a partir da vers˜ao 7.0 do Android, o ART foi atualizado com suporte
a novas Interface de Programac¸˜ao de Aplicac¸˜oes (API) introduzidas com a vers˜ao 8 do
Java. Entretanto, a atualizac¸˜ao de dispositivos existentes no mercado leva muito tempo,
e para que as aplicac¸˜oes continuem a funcionar nos mesmos, o uso dessas APIs fica im-
possibilitado ou bastante limitado. Para evitar que isso ocorra ao se utilizar o Kotlin, seu
compilador gera um c´odigo completamente compat´ıvel com o byteCode do Java 6, o
qual ´e utilizado por vers˜oes anteriores do Android, fazendo com que aplicac¸˜oes Android
escritas em Kotlin sejam compat´ıveis com todas as vers˜oes do Android. [JetBrains 2017]
Nesse contexto, esse artigo tem como objetivo geral explorar os principais aspec-
tos e caracter´ısticas da linguagem Kotlin, avaliando-a como alternativa ao Java no desen-
volvimento de aplicac¸˜aes Android. Ser˜ao comparados trechos de c´odigo escritos em Java
e Kotlin. Tamb´em ser´a analisado como o Kotlin afeta a legibilidade e compreenc¸˜ao da
implementac¸˜ao de um algor´ıtimo. Por fim, ser´a desenvolvida uma simples aplicac¸˜ao a
t´ıtulo de estudo de caso.
Ap´os abordar a origem da linguagem Kotlin e da plataforma Android, a Sec¸˜ao
1 tamb´em explicou como se tornou poss´ıvel utilizar Kotlin para desenvolver aplicac¸˜oes
Android. Na Sec¸˜ao 2, s˜ao abordadas algumas das principais caracter´ısticas que a tor-
naram uma linguagem t˜ao atraente ao desenvolvedor. A Sec¸˜ao 3 apresenta um estudo
mais aprofundado de seu impacto no desenvolvimento por meio de comparativos com o
Java analisando trechos de c´odigo. A Sec¸˜ao 4 an´alisar´a as diferenc¸as entre uma mesma
aplicac¸˜ao escrita em Java e Kotlin como estudo de caso. Por fim, a Sec¸˜ao 5 apresentar´a
uma conclus˜ao deste trabalho e fornecer´a sugest˜oes para trabalhos futuros.
2. Caracter´ısticas da Linguagem Kotlin
Nessa sec¸˜ao, ser˜ao descritas as principais caracter´ısticas da linguagem Kotlin.
2.1. Elementos B´asicos da Linguagem
Kotlin foi desenvolvida como uma linguagem com dados fortemente tipados e utiliza-se
bastante de inferˆencia de tipos para facilitar o desenvolvimento, por conta disto, em usa
sintax o tipo de um dado, quando necess´ario, ´e definido ap´os o nome de uma vari´avel. Ou-
tra caracter´ıstica de sintax ´e a n˜ao obrigatoriedade do uso de ’;’ ao final de cada instruc¸˜ao
e em suas definic¸˜oes de escopo, um arquivo n˜ao est´a limitado a conter apenas uma ´unica
classe e a mesma n˜ao necessita ter o mesmo nome de seu arquivo.
Al´em de ser utilizado seguindos os conceitos de Orientac¸˜ao a Objetos (OO), por
suportar receber func¸˜oes como argumentos em outras func¸˜oes, a programac¸˜ao com Kotlin
´a capaz de seguir o paradgma de programac¸˜ao funcional.
2.2. Interoperabilidade
Kotlin foi desenvolvido com o objetivo de ter 100% de interoperabilidade com a lingua-
gem Java. Isso significa que, em um mesmo projeto contendo ambas as linguagens, ´e
poss´ıvel uma classe Java invocar func¸˜oes escritas em Kotlin e vice-versa de forma extre-
mamente simples. Al´em de membros de uma classe, func¸˜oes de extens˜ao, classes objeto,
entre outras caracter´ısticas extras da linguagem, fornecem total suporte a serem utilizadas
diretamente em um c´odigo Java. [JetBrains 2016a]
2.3. Nulidade
Uma dos erros mais comuns em aplicac¸˜oes Java ´e o Null Pointer Exception ou NPE, o
qual ´e causado, por exemplo, pela tentativa de se acessar dados utilizando uma referˆencia
a um objeto inexistente. Isso acontece porque, ao se declarar referˆencia de objeto em Java,
a linguagem n˜ao verifica se um valor foi atribu´ıdo ao mesmo antes de sua utilizac¸˜ao, e
isso ´e verificado apenas em tempo de execuc¸˜ao do c´odigo.
Para mitigar esse problema, o Kotlin foi desenvolvido com suporte a tipo nulos
expl´ıcitos, onde, ao se declarar uma vari´avel ou referˆencia, o desenvolvedor precisa espe-
cificar se a mesma pode ou n˜ao ser nula utilizando o operador ’?’. Este mesmo operador
tamb´em ´e utilizado, logo antes do operador ’.’, para se acessar dados ou func¸˜oes de fo-
ram segura em objetos declarados como poss´ıvelmente nulos. Com isso, o compilador do
Kotlin, antes mesmo de executar a aplicac¸˜ao, saber´a alertar sobre operac¸˜oes imposs´ıveis
de serem realizadas. [Wharton 2015]
2.4. Func¸˜oes de Extens˜ao
Projetos Java, em geral, costumam conter classes est´aticas utilit´arias respons´aveis apenas
por receber dados de um certo tipo, transformado e retorn´a-lo ou receber um objeto como
referˆencia e aplicar alterac¸˜oes no mesmo. Func¸˜oes de Extens˜ao em Kotlin, de forma
similar ao C#, permitem adicionar func¸˜oes extras a uma classe sem a necessidade de
inserirmos c ´Odigo diretamente na mesma. [Moskala and Wojda 2017]
A exemplo, uma func¸ao Java utilit´aria que recebe como parˆametro uma url de
imagem e a referˆencia de um componente de image, efetua o carregamento da imagem
remota e a exibe no componente de imagem, poderia ser escrita como uma func¸˜ao ex-
tendida da classe que representa o componente de imagem. Assim, o seguinte trecho
de c´odigo ImageUtils.loadUrlInto(imageview, url) poderia ser substitu´ıdo por image-
view.loadFromUrl(url), simplificado a codificac¸˜ao, melhorando a legibilidade e facili-
tando a compreenc¸˜ao do mesmo.
2.5. Sintax enxuta
Diferente do Java, fluxos conficionais, tais como if e when, podem ser utilizados durante
uma atribuic¸˜ao para que o valor atribu´ıdo seja vari´avel, fazendo com que a sintax de uma
atribuic¸˜ao condicional em Kotlin fique com pelo menos 3 vezes menos linhas de c´odigo.
Do mesmo modo, o retorno de uma func¸˜ao pode ser atribu´ıdo diretamente logo ap´os sua
declarac¸˜ao, sem a necessidade de se definir um corpo de func¸˜ao contendo a palavra-chave
return.
Na programac¸˜ao orientada a objeto, existe um conceito conhecido como encap-
sulamento, o qual consiste de remover o acesso direto a um valor armazenado em uma
classe, fornecendo essa informac¸˜ao apenas atrav´es de um func¸˜ao get, onde a mesma pode
ser tratada adequadamente antes de ser disponibilizada. Este conceito j´a est´a presente de
forma autom´atica no Kotlin, pois quando definimos uma vari´avel mut´avel utilizando var,
ou uma vari´avel somente leitura utilizando val, estamos criando uma property, a qual
encapsula o valor da vari´avel, definindo um get e set para a mesma. [JetBrains 2016b]
Normalmente, quando ´e necess´ario se fazer diversas chamadas a diferentes
func¸˜oes de um classe, precisamos repetir a referˆencia a mesma v´arias vezes. Para evi-
tar que isto acontec¸a, a biblioteca padr˜ao do Kotlin fornece diversas func¸˜oes utilit´arias,
tais como apply e with, que auxiliam a troca de contexto referenciado pela palavra-chave
this, assim, ao serem utilizados, podemos invocar v´arias func¸˜oes de uma classe sem a
necessidade de inserir novamente sua referˆencia.
2.6. Func¸˜oes de ordem superior
Uma func¸˜ao de ordem superior ´e caracterizada por retornar ou receber como paramˆetro
uma outra func¸˜ao. Este ´e um recurso bastante poderoso, pois permite que um conjunto
de instruc¸˜oes seja passado para uma func¸˜ao, ao inv´es de apenas valores primitivos ou
objetos. Quando uma fuc¸˜ao ´e definida ao mesmo instante em que est´a sendo passada
como parˆametro, esta torna-se uma func¸˜ao anˆonima, tamb´em conhecida como lambda.
Em Kotlin, parˆametros de uma lambda podem ser definidos com tipo expl´ıcito ou
inferido, e o lambda tem apenas um ´unico parametro, sua definic¸˜ao pode ser omitida e
o mesmo acessado pelo operador it. Para facilitar ainda mais a legibilidade do c´odigo,
quando uma func¸˜ao possui um lambda como seu ´ultimo parˆametro, ´e poss´ıvel defin´ı-
lo logo ap´os a chamada da func¸˜ao e, caso a mesma n˜ao tenha nenhum outro parˆametro,
os parˆenteses podem ser omitidos. Um exemplo disto ´e a func¸˜ao map, que transforma
uma lista em outra conforme operac¸˜ao informada. Assim, a syntax list.map({ it * 2}) ´e
equivalente a list.map{it * 2}.
2.7. Falta de constantes ou func¸˜oes est´aticas
Diferentemente do Java, em Kotlin n˜ao h´a o que se conhece por constantes ou func¸˜oes
est´aticas, membros de uma classe que podem ser acessados sem a necessidade de uma
referˆencia ou instˆancia da mesma. Entretanto, cada classe Kotlin pode conter um ou mais
objetos ”companheiros”, definidos por companion object {} dentro da classe, os quais
s˜ao acessados da mesma forma.
Um objeto companheiro n˜ao possui construtor, pois n˜ao precisar´a ser instanciado.
´E compartilhado entre todas as instˆancias da mesma classe, pode implementar interfa-
ces, e quando n˜ao nomeado explicitamente, fica com o nome Companion atribu´ıdo a
ele. Entretanto, este nome padr˜ao pode ser omitido, e constantes ou membros desse ob-
jeto poder˜ao ser acessados diretamente atrav´es do nome de sua classe, como no seguinte
exemplo: MyClass.functionInsideACompanionObject(). [Leiva 2016]
3. An´alise comparativa com a Linguagem Java
Esta sec¸˜ao tem como objetivo mostrar, de forma pr´atica, as diferenc¸as existentes entre
as implementac¸˜oes utilizando Kotlin e Java. Nos seguintes subt´opicos est˜ao definidos os
principais recursos que costumam gerar boilerplate code, ou seja, recursos que necessi-
tam de muito c´odigo para realizar uma tarefa relativamente simples.
3.1. Singleton
Define-se como Singleton uma classe que possua instˆancia ´unica em toda a aplicac¸˜ao. A
Figura 1 mostra como esta condic¸˜ao pode ser adquirida em implementac¸˜oes com Java e
Kotlin.
Figura 1. Singleton em Java `a esquerda e em Kotlin `a direita
Como ´e poss´ıvel observar, Kotlin possui o conceito de objeto, definido pela pa-
lavra reservada object, que corresponte ao mesmo que uma classe de instˆancia ´unica e,
consequentemente, construtor, uma vez que n˜ao haver´a instanciac¸˜ao manual da mesma.
3.2. Classes de dados
Classes de dados, tamb´em conhecidas como Plain Old Java Object (POJO), s˜ao aquelas
destinadas a apenas armazenar e encapsular informac¸˜oes referente a um escopo m´ınimo.
Sendo assim, normalmente possuem apenas vari´aveis privadas, suas respectivas func¸˜oes
get e set, as func¸˜oes equals() e hashCode(), utilizadas para comparac¸˜ao, e a func¸˜ao toS-
tring(), respons´avel por imprimir todas suas informac¸˜oes do objeto.
Em Kotlin, ao se colocar a palavra reservada data antes de class, teremos uma
classe que j´a possuir´a as func¸˜oes equals(), hashCode() e toString(), uma vez que as
mesmas ser˜ao implementadas e inseridas automaticamente pelo compilador durante o
processo de cosntruc¸˜ao da aplicac¸˜ao. Al´em disto, haver´a uma func¸˜ao extra chamada
copy(), a qual pode ser utilizada para duplicar o objeto e ao mesmo tempo alterar valores
de suas vari´aveis na c´opia. Na Figura 2 abaixo temos um exemplo de como esse tipo de
classe ´e definida.
Figura 2. Classe de dados em Java a esquerda e em Kotlin a direita
3.3. Transformac¸˜ao de colec¸˜oes
Trabalhar com transformac¸˜ao de colec¸˜oes ´e algo bastante comum em diversas aplicac¸˜oes,
entretanto, at´e o Java 7, esta era uma tarefa nada trivial, uma vez que se fazia necess´ario
definir uma nova colec¸˜ao, e inserir items nela `a medida que a colec¸˜ao inicial era percorrida
e um processamento efetuado em cada um de seus item.
No Java 8, foi introduzida a API de Stream, fazendo com que toda colec¸˜ao possa
gerar um objeto do tipo stream, no qual func¸˜oes de transformac¸˜ao podem ser aplicadas
a fim de modificar cada um de seus items, obtendo-se uma nova colec¸˜ao [Urma 2014].
Contudo, como mencionado anteriormente, at´e a vers˜ao 7.0 do Android, o byteCode de
suas aplicac¸˜oes era baseado no Java 6, impossibilitando o uso da API de Stream.
Utilizando-se de func¸˜oes extendidas, a biblioteca padr˜ao do Kotlin fornece
func¸˜oes de transformac¸˜ao de colec¸˜oes que podem ser chamadas diretamente na colec¸˜ao e,
assim como na API de stream, possibilitam o encadeamento de diversas transformac¸˜oes.
Figura 3. Transformac¸ ˜ao de colec¸ ˜ao em Java a esquerda e em Kotlin a direita
A Figura 3 mostra uma lista de usu´arios sendo filtrada pelos que possuem idade
menor que 30, ordenada pelo mesmo atributo e mapeada como lista de nomes. Podemos
notar que o algor´ıtimo em Kotlin, al´em de menor, tamb´em nos fornece melhor legibi-
lidade, facilitando seu entendimento. Al´em disso, muitas destas func¸˜oes em Kotlin s˜ao
definidas com o operador inline, fazendo com que o compilador insira o c´odigo da func¸˜ao
onde ela ´e referˆenciada, ao inv´es de invoc´a-la, tornando sua execuc¸˜ao seja mais eficiente.
3.4. Tarefas Ass´ıncronas
No Android, quando uma aplicac¸˜ao inicia, ´e criada uma Thread chamada Main Thread,
linha de execuc¸˜ao de c´odigo na qual todo c´odigo referente `a interface ´e processado, seja
ele referente `a renderizac¸˜ao ou a interac¸˜oes do usu´ario. Assim, para evitar travamentos,
tarefas que demandem muito processamento devem ser executadas em uma outra Thread.
Aplicac¸˜oes mobile frequentemente necessitam executar tarefas ass´ıncrona, seja
um extenso processamento de dados, acesso a uma API remota ou o download de arquivo.
Para n˜ao sobrecarregar a Main Thread, o Android disponibiliza a classe AsyncTask, a
qual executa opoerac¸˜oes em outra Thread usando a func¸˜ao doInBackground() e retorna
o resultado na Main Thread usando a func¸˜ao onPostExecute() [Debunne 2010].
Desde a vers˜ao 1.1, o Kotlin proporciona ao desenvolvedor Android a utilizac¸˜ao
de Corotinas, linhas de execuc¸˜ao de c´odigo semelhante a Thread, na execuc¸˜ao de tarefas
ass´ıncronas de maneira simples, elegante e mais poderosa que AsyncTask. [Breslav 2016]
A Figura 4 mostra como ´e feito o carregamento de uma imagem remota utilizando Async-
Task e a Figura 5 demostra o uso de Corotinas para o mesmo prop´osito.
Figura 4. Download e exibic¸ ˜ao de imagem remota em Java usando AyncTask
Figura 5. Download e exibic¸ ˜ao de imagem remota em Kotlin usando Coroutines
3.5. Kotlin Android Extensions
Kotlin Android Extensions ´e um plugin que tem como objetivo auxiliar no desenvolvi-
mento fornecendo, em tempo de compilac¸˜ao, recursos como Mapeamento de componen-
tes visuais e implementac¸˜ao de Objeto do tipo Parcelable.
3.5.1. Mapeamento de componentes visuais
No desenvolvimento de uma aplicac¸˜ao Android, uma das primeiras APIs que o desenvol-
vedor aprende a utilizar ´e a func¸˜ao findViewById(), a qual tem como objetivo obter acesso
a um componente visual atrav´es de seu identificador ´unico, ou id. Esta func¸˜ao pertence
a classe activity, que representa um interface da aplicac¸˜ao, e normalmente ´e utilizada
durante a criac¸˜ao da mesma.
Para que todos os m´etodos da activity tenham acesso aos seus componentes vi-
suais, faz-se necess´aria a criac¸˜ao de uma vari´avel, em n´ıvel de classe, correspondente
a cada componente e, durante a criac¸˜ao da interface, a cada uma dessas vari´aveis deve
ser atribu´ıda a referˆencia retornada pela chamada da func¸˜ao findViewById() com o id
correspondente ao componente visual representado por ela.
O mapeamento de componentes visuais feito pelo Kotlin Android Extensions
encarregada-se de todo o procedimento citado anteriormente, gerando, para cada inter-
face, uma classe com o mapeamento dos componentes da mesma. Assim, ´e necess´ario
apenas declarar um diretiva de uso da classe de mapeamento da interface desejada, con-
forme destacado na Figura 6, e utilizar o componente por toda a activity apenas infor-
mando seu id como referˆencia a ele.
Figura 6. Mapeamento de componentes visuais em Java a esquerda atrav´es de
findViewById e em Kotlin a direita utilizando Kotlin Android Extensions
3.5.2. Objeto do tipo Parcelable
Em aplicac¸˜oes Android, muitas vezes surge a necessidade de se transferir um objeto entre
escopos distintos, por exemplo, duas activities. H´a dois m´etodos de se fazer isto. O pri-
meiro e mais comum no mundo Java ´e fazendo com que o objeto seja do tipo Serializable.
O segundo, exclusivo do desenvolvimento Android, ´e tornando-o do tipo Parcelable.
Objetos do tipo Serializable, ao serem transferidos, s˜ao recuperados no desti-
nat´ario utilizando um t´ecnica conhecida por reflection. Esta t´ecnica faz com que uma
nova instˆancia daquele objeto seja criada e os valores de seus campos sejam recuperados
com acesso direto aos mesmos, sem utilizac¸˜ao de construtor ou func¸˜oes set. Tal t´ecnica,
no ambiente mobile, n˜ao gera um bom desempenho, pois requer muito processamento.
Utilizado por diversos componentes internos do Android, objetos do tipo Parce-
lable s˜ao transferidos de forma bastante eficiente, uma vez que seus valores internos s˜ao
agrupados dentro de um objeto Parcel, objeto transfer´ıvel entre processos e capaz de ar-
mazenar valores primitivos, serializ´aveis ou parcel´aveis. Para evitar o uso de reflection,
deve ser definida uma func¸˜ao writeToParcel, respons´avel por inserir os valores internos
do objeto original no Parcel e um construtor especial chamado CREATOR, utilizado para
recriar o objeto inicial no destinat´ario [Murphy 2017].
A partir da vers˜ao 1.1.4 do Kotlin, o Kotlin Android Extensions fornece uma
anotac¸˜ao chamada Parcelize, a qual, em tempo de compilac¸˜ao, responsabiliza-se por pro-
ver toda a implementac¸˜ao necess´aria a objetos do tipo Parcelable. Conforme apresentado
na Figura 7, seu uso torna o c´odigo mais leg´ıvel e facilita sua manutenc¸˜ao.
Figura 7. Implementac¸ ˜ao de Parcelable em Java a esquerda e em Kotlin a direita
utilizando Kotlin Android Extensions
4. Estudo de caso
A t´ıtulo de estudo de caso, foi desenvolvida uma simples aplicac¸˜ao em Kotlin e em Java
com as seguintes funcionalidades:
• Tela de registro;
• Tela de login;
• Tela exibindo a temperatura da localizac¸˜ao do usu´ario;
• Usu´ario ser´a armazenado no banco de dados local;
• Localizac¸˜ao atual ser´a obtida utilizando o Global Position System (GPS)
• Informac¸˜oes de temperatura ser˜ao obtidas pela internet.
A Figura 8 mostra as trˆes telas da aplicac¸˜ao, sendo a primeira a tela de login,
seguida pela tela de registro e, por ´ultimo, a tela de informac¸˜oes da temperatura local.
Figura 8. Aplicac¸ ˜ao estudo de caso, da esquerda para a direita, tela de login, tela
de registro e tela de informac¸ ˜oes
A tela de login tem como objetivo receber um nome de usu´ario e senha a serem
verificados no banco de dados local, e quando v´alidos, o usu´ario ser´a direcionado para
a tela de informac¸˜oes de temperatura. Na tela de login, tamb´em h´a uma opc¸˜ao para
direcionar novos usu´arios para uma tela de registro, onde eles cadastrar˜ao nome de usu´ario
e senha. Para simplicidade do desenvolvimento, nesta etapa, nenhum tipo de criptografia
foi envolvido no armazemanto das informac¸˜oes do usu´ario.
Como tela principal da aplicac¸˜ao, a tela de informac¸˜oes de temperatura obt´em a
localizac¸˜ao do usu´ario usando o GPS e a utiliza para fazer uma consulta ao servic¸o Re-
presentational State Transfer (REST) localizado no enderec¸o api.openweathermap.org,
para obter a temperatura da localizac¸˜ao atual do usu´ario e exib´ı-la na tela.
Ambas aplicac¸˜oes foram desenvolvidas seguindo a mesma estrutura, o que resul-
tou em um mesmo n´umero de classes, 10 em cada aplicac¸˜ao. Al´em disso, excluindo-se
a dependendˆencia referente ao uso da biblioteca padr˜ao do Kotlin, ambas utilizam as se-
guintes bibliotecas:
• ConstraintLayout e Design na elaborac¸˜ao das interfaces;
• PlayServicesLocation para requisitar a localizac¸˜ao;
• Room para utilizac¸˜ao do banco de dados SQLite local;
• Retrofit para comunicac¸˜ao com o servic¸o REST remoto;
• Glide para carregamento de imagem remota.
Utilizando a ferramenta CLOC, acrˆonimo de Count Lines of Code, dispon´ıvel
em http://cloc.sourceforge.net, o c´odigo fonte de ambas as aplicac¸˜oes escritas, respecti-
vamente, em Java e Kotlin, foi analisado. Como pode visualizado na Figura 9, a aplicac¸˜ao
escrita em Java contou com um total de 452 linhas de c´odigo Java. Por sua vez, a aplicac¸˜ao
escrita em Kotlin, de acordo com a Figura 10, cont´em apenas 335 linhas de c´odigo.
Figura 9. Aplicac¸ ˜ao estudo de caso, da esquerda para a direita, tela de login, tela
de registro e tela de informac¸ ˜oes
Figura 10. Aplicac¸ ˜ao estudo de caso, da esquerda para a direita, tela de login,
tela de registro e tela de informac¸ ˜oes
Com um total de 117 linhas de c´odigo a menos, a aplicac¸˜ao escrita em Kotlin
resultou em um c´odigo fonte cerca de 25% menor. Tal ganho se deu pela utilizac¸˜ao de
conceitos abordados anteriormente, tais como, nulidade, func¸˜oes de extenc¸˜ao, func¸˜oes de
ordem superior, objetos singleton, classes de dados, tarefas ass´ıncronas e mapeamento de
componentes visuais, por meio do Kotlin Android Extensions.
5. Conclus˜ao
Este trabalho abordou a linguagem de programac¸˜ao Kotlin, descrevendo suas principais
caracter´ısticas, bem como suas vantagens no desenvolvimento de aplicativos para dispo-
sitivos m´oveis baseados em Android.
Caracter´ısticas presentes na linguagem Kotlin, tais como nulidade e func¸˜oes de
extenc¸˜ao, auxiliam no desenvolvimento de uma aplicac¸˜ao menos prop´ıcia a erros de
NullPointException e com maior flexibilidade de implementac¸˜ao e reaproveitamento de
c´odigo. Definic¸˜ao de padr˜oes Singleton e objetos POJO ´e algo que a linguagem traz na-
tivamente. Trabalhar com colec¸˜oes tornou-se simples, ao mesmo tempo que provˆe um
c´odigo de excelente legibilidade e compreens˜ao.
Embora existam m´etodos para gerar a implementac¸˜ao da func¸˜ao writeToParcel
e do construtor CREATOR, esta implementac¸˜ao, al´em de deixar o c´odigo extremamente
polu´ıdo, precisa ser constantemente atualizada sempre que houver qualquer alterac¸˜ao nos
campos deste objeto. Isso aumenta o risco de instroduzir erros de execuc¸˜ao na aplicac¸˜ao.
Assim, a utilizac¸˜ao da anotac¸˜ao Parcelize traz grandes benef´ıcios, pois permite superar
essas quest˜oes.
Da mesma forma, as func¸˜oes necess´arios `as classes de dados Java, tais como gets,
sets, equals(), hashCode() e toString(), s˜ao geradas automaticamente, mas as data class
do Kotlin evitam a necessidade de tais classes precisarem ser atualizadas sempre que um
de seus campos ´e alterado, removido ou uma novo ´e adicionado.
Ao desenvolver uma aplicac¸˜ao como estudo de caso, foi poss´ıvel observar que
a adoc¸˜ao do Kotlin resultou em uma aplicac¸˜ao com c´odigo mais leg´ıvel, simplificado e
de f´acil manutenc¸˜ao. Contabilizou-se, tamb´em, uma significativa reduc¸˜ao no n´umero de
linhas necess´arias ao desenvolvimento de uma aplicac¸˜ao que utiliza recursos b´asicos, tais
como, armazenamento local, uso de sensores e acesso a servic¸os remotos.
Em nossa an´alise, a adoc¸˜ao do Kotlin como linguagem alternativa ao Java no de-
senvolvimento de aplicac¸˜oes Android, al´em de reduzir a possibilidade de ocorrˆencia de
erros na aplicac¸˜ao, proporciona menor esforc¸o na implementac¸˜ao de recursos b´asicos,
fornecendo maior legibilidade, flexibilidade e facilidade de manutenc¸˜ao, extenc¸˜ao e
compreenc¸˜ao do c´odigo desenvolvido.
Estudos futuros podem abordar, com maior profundidade, a utilizac¸˜ao de corouti-
nas em aplicac¸˜oes com estruturas complexas de tarefas ass´ınconas. A adoc¸˜ao do Kotlin na
elaborac¸˜ao de Domain Specific Languages (DSL) tamb´em se apresenta como um trabalho
futuro interessante. Por fim, pesquisas futuras podem envolver a investigac¸˜ao sobre como
o compilador do Kotlin trabalha para gerar bytecodes otimizados, tornando poss´ıvel a
utilizac¸˜ao de algumas caracter´ısticas de linguagens modernas em uma JVM baseada no
JDK 6.
O c´odigo fonte de ambas as aplicac¸˜oes desenvolvidadas como estudo de caso
encontra-se dispon´ıvel no github atrav´es do seguintes reposit´orios:
• Aplicac¸˜ao Java: https://github.com/edipo2s/Uni7Java
• Aplicac¸˜ao Kotlin: https://github.com/edipo2s/Uni7Kotlin
Referˆencias
Breslav, A. (2016). First glimpse of kotlin 1.1: Coroutines, type alia-
ses and more. https://blog.jetbrains.com/kotlin/2016/07/first-glimpse-of-kotlin-1-1-
coroutines-type-aliases-and-more/.
Debunne, G. (2010). Multithreading for performance. https://android-
developers.googleblog.com/2010/07/multithreading-for-performance.html.
Google (2007). Where’s my gphone? https://googleblog.blogspot.com.br/2007/11/wheres-
my-gphone.html.
Google (2009). Introducing android 1.5 ndk, release 1. https://android-
developers.googleblog.com/2009/06/introducing-android-15-ndk-release-1.html.
Google (2017). Art and dalvik. https://source.android.com/devices/tech/dalvik.
Jemerov, D. (2011). Hello world. https://blog.jetbrains.com/kotlin/2011/07/hello-world-
2.
Jemerov, D. and Isakova, S. (2017). Kotlin in Action. Manning.
JetBrains (2016a). Calling java code from kotlin.
http://kotlinlang.org/docs/reference/java-interop.html.
JetBrains (2016b). Properties and fields. http://kotlinlang.org/docs/reference/properties.html.
JetBrains (2017). Using kotlin for android development.
https://kotlinlang.org/docs/reference/android-overview.html.
Leiva, A. (2016). Kotlin for Android Developers. Leanpub.
Moskala, M. and Wojda, I. (2017). Android Development with Kotlin. Packt.
Murphy, M. L. (2017). The Busy Coder’s Guide to Android Development, volume 8.6.
CommonsWare.
Oreshnikova, A. (2012). Kotlin - open source.
https://blog.jetbrains.com/kotlin/2012/02/kotlin-goes-open-source-2.
Titus, J. (2017). Google i/o 2017: Empowering developers to build the best experien-
ces across platforms. https://android-developers.googleblog.com/2017/05/google-io-
2017-empowering-developers-to.html.
Urma, R.-G. (2014). Processing data with java se 8 streams, part 1. Java Magazine, pages
50–55.
Wharton, J. (2015). Using project kotlin for android.
Wilson, M. (2008). T-mobile g1: Full details of the htc dream android phone.
https://gizmodo.com/5053264.