Pular para o conteúdo principal

Recursos da Linguagem Kotlin - Extensions

Olá pessoal, hoje vamos começar a abordar alguns recursos interessantes da Linguagem Kotlin, a linguagem possui vários recursos que facilitam muito a vida do desenvolvedor, e hoje vamos falar sobre as Extensions.


Conhecendo o Kotlin

Kotlin é uma linguagem desenvolvida pela JetBrains, esta é uma empresa amplamente conhecida pelas ferramentas que ajudam os desenvolvedores no dia a dia, tais como: IntelliJ, PyCharm, GoLand, WebStorm

O Kotlin é uma linguagem originalmente voltada para a JVM, a linguagem possui uma interoperabilidade com Java que realmente chama a atenção, podendo você ter uma classe em Kotlin chamando métodos de uma classe Java ou vice versa, fazendo que a curva para adoção da linguagem principalmente para pessoas que já conheçam Java seja pequena e trivial.

Com sua evolução, o Kotlin também abrange outros ecossistemas, vamos analisar cada um deles:

Mobile Multiplataforma

A popularidade do Kotlin se tornou massiva quando a Google o adotou como linguagem principal para desenvolvimento nativo Android.

Atualmente, a plataforma Kotlin possui a possibilidade de todas as lógicas de negocio da sua aplicação Mobile estarem em uma única base de código Kotlin, com isso não seria necessário portar para uma outra tecnologia, isto se dá a um novo engine multiplataforma que consegue garantir o desenvolvimento cross-platform (Android, iOS), veja mais detalhes aqui.

Backend

O desenvolvimento Backend com Kotlin vem se tornando muito popular, já temos grandes empresas o adotando como a principal linguagem de Backend, e isso se dá a vários fatores, tais como:
  • Compatibilidade com o código Java;
  • Uso da JVM (Runtime poderoso e em constante evolução);
  • Recursos poderosos (NullSafety, Data Classes, Extensions functions, Corotines).

Além dos recursos da linguagem, a variedade de frameworks é um outro beneficio do uso do Kotlin, vamos listar alguns deles, e percebemos que frameworks famosos no mundo Java funcionam muito bem com o Kotlin:

Web

Um outro recurso interessante da plataforma Kotlin é a ter como transpilar o código Kotlin para JavaScript, atualmente com foco em ES5, podemos ver mais detalhes aqui, com essa funcionalidade temos várias possibilidades de uso, tais como:
  • Criação de frontend com base de código Kotlin;
  • Criação de aplicações Serverless;
  • Criação de bibliotecas para JavaScript e TypeScript.

Data Science

A área de ciência de dados esta em ascensão, portanto temos uma variedades grande de projetos sendo desenvolvidos, na área de ciência de dados a plataforma Java é muito utilizada, onde temos grandes projetos desenvolvidos para JVM, dessa forma podemos usar o Kotlin, devido sua total compatibilidade com Java.

Uma outra novidade é o Kotlin Jupyter, os notebooks são ferramentas muito utilizadas nesta área, os notebooks geralmente eram para Python e Scala, e agora temos também uma alternativa utilizando Kotlin. 

Extensions

Os recursos da linguagem Kotlin são inúmeros, mas hoje iremos falar sobre as  extensions.

Extension Functions

As extension functions permite adicionarmos uma função a uma classe existente, sendo esta uma classe do seu modelo de domínio, ou até mesmo uma biblioteca de terceiro, vamos analisar o seguinte exemplo:

1
2
3
4
5
    val strUuid = "58365b4b-5186-4a32-acf8-4e0ffa70afc5"
    
    val uuid = UUID.fromString(strUuid)
    
    println(uuid)


No código acima temos uma String no formato do padrão UUID, e depois realizamos a criação de um objeto UUID a partir desta String, até ai é um código pequeno e simples, agora imagine que você use o UUID em vários pontos do seu sistema, e precise realizar esta transformação acima constantemente.

No Kotlin usamos as extension para adicionar métodos a uma determinada classe, sem precisar usar herança, ou algum pattern como decorator ou proxy, vamos ver como podemos criar uma extension function para a classe String.


fun String.toUuid() = UUID.fromString(this)

A sintaxe da extension function é como abaixo:

Estrutura de uma Extension Function.

As extension functions não modificam as classes na qual foram declaradas, o compilador as tornam funções disponíveis para a classe que ela foi declarada.

Outros detalhes que devemos saber:
  • Elas podem ser declaradas em arquivos separados, e serem utilizadas através do import;
  • Usamos this, para acessar dados da classe na qual ela foi declarada;
  • Podem ser declaradas usando a sintaxe mínima de funções (Como no exemplo).

fun String.toUuid() = UUID.fromString(this)

fun main() {
    
    val strUuid = "58365b4b-5186-4a32-acf8-4e0ffa70afc5"
    
    println(strUuid.toUuid())
}

Extension Property

Da mesma forma que declaramos extension functions, podemos declarar extension property, elas possuem o mesmo comportamento que as funções, podendo ser globais ou terem um escopo reduzido, a sintaxe seria a seguinte:

Estrutura de uma Extension Property.

Agora vamos analisar um exemplo básico, onde vamos adicionar uma propriedade chamada emailValid a classe User:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
val User.emailValid:Boolean
get(){
    val pattern = Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE)

    return pattern.matcher(this.email).find()
}
	
data class User(val email:String)

fun main(){

	val user1 = User("kotlin@kotlin.com")
	val user2 = User("kotlin.com")
	
	println(user1.emailValid)
	println(user2.emailValid)
}


Na linha 1 declaramos uma propriedade chamada emailValid, seu tipo será Boolean, que será o resultado de uma expressão que verifica se a propriedade email da Classe User contém um dado válido.

As extension properties possuem algumas características, como:
  • var ou val implica se o valor será mutável ou imutável;
  • Não podem ter uma inicialização direta;

Extension Members

Agora vamos ver como declarar extensões como membros, uma extensão membro só pode ser utilizada dentro do escopo onde foi declarada, vamos analisar o exemplo abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package extension_function.scope

data class Product(val name:String, val available:Boolean){
	
	fun String.formatName() = toUpperCase()
	
	fun show(){
		println("Produto: ${name.formatName()} - Disponível: $available")
	}
}

data class Category(val name:String){
	
	fun String.configName() = ">>> ${toUpperCase()}"
	
	fun show(){
		println("Categoria: ${name.configName()}")
	}
}

fun main(){
	
	val product = Product("TV 42 polegadas", true)
	
	val category = Category("TV")
	
	product.show()

	category.show()
}


Neste exemplo temos duas classes para entendermos como uma extensão membro funciona, na classe Product declaramos na linha 5 uma extension function para o tipo String com o nome formatName(), isso significa que todo tipo String dentro de Product terá este método disponível.

Já na classe Category na linha 14, declaramos uma extension function para o tipo String chamado configName(), isso significa que toda String dentro de Category terá este método disponível.

Como vimos nos exemplos acima, as Extensions são uma das features disponíveis na linguagem Kotlin, esta feature é amplamnete utilizada e muito comum em códigos do dia a dia, mas devemos sempre analisar o seu uso, para criar extensões onde não seja necessário.

Código Fonte

Referências

Comentários

Postagens mais visitadas do Blog