DEV Community

Cover image for Conhecendo o Kotlin
Thiago Lino
Thiago Lino

Posted on • Edited on

Conhecendo o Kotlin

Se como eu lhe foi dado o desafio de aprender Kotlin e já trabalhar com a linguagem ou apenas por conhecimento próprio, espero que este post lhe ajude.

Iniciando pela parte técnica o Kotlin se trata de uma linguagem de tipagem estática, os tipos das variáveis são checados durante a compilação gerando um erro se houver troca de tipo. Sua tipagem é forte, o que significa que não possui flexibilidade nas operações entre variáveis de tipos diferentes.

val nomeOperario: String = "José"
val horasExtra: Int = 1000
println(nomeOperario + horasExtra) //gera um erro na compilacao
Enter fullscreen mode Exit fullscreen mode

A declaração de variáveis, como no exemplo acima, usa a palavra chave val ou var. A primeira não permite alterar o valor que lhe foi atribuído, equivalente ao final em java, a última permite que o valor seja alterado após declarado.

O ponto e vírgula ';' no final da linha de trecho é opcional, porém para aproveitar a sintaxe enxuta da linguagem é indicado não adicionar.

Um detalhe importante é que o Kotlin exige que um valor seja atribuído a variável durante sua declaração.

A visibilidade default das variáveis é public.

No Kotlin temos inferência de tipo, porém podemos deixar o valor explícito com dois pontos ':' seguido do tipo.

E como resultado temos:

val nomeOperario: String = "José"

Já que estamos falando de variáveis uma opção interessante para a concatenação de variáveis a String é a utilização do String template, basta adicionar um cifrão '$' na frente do nome da variável para a concatenação:

println("Senhor(a) $nomeOperario ...") // Senhor(a) José ...

Para realizar a concatenação com a propriedade de um objeto é similar, porém com o objeto e propriedade entre chaves '{':

println("Tamanho nome: ${nomeOperario.length}") // Tamanho nome: 4

Caso necessite escapar caracteres especiais podemos usar o raw Strings, adicionamos a string entre um par de 3 aspas duplas:

val workspace = """/home/dev/workspace"""

Inclusive podemos utilizar as 3 aspas duplas para ter uma quebra de linha:

val cargaSemanal = """Fixadas 30 horas semanais com opções:
I. De segunda a sexta com 6(seis) horas diárias"""
Enter fullscreen mode Exit fullscreen mode

Após esta breve visão geral das variáveis, podemos falar sobre os métodos.

Para a declaração do método se inicia com a visibilidade do método, quando omissa a default é public, palavra reservada 'fun' seguido pelo nome do método acompanhado pela abertura e fechamento de parênteses '(', quando houverem parâmetros estes vão entres os parênteses. Caso possua um retorno, dois pontos ':' são adicionados após o parêntese de fechamento seguido pelo tipo do retorno. O retorno quando não especificado é do tipo Unit.

fun salvarReajusteSalarial(): Boolean {
    //realiza reajuste adequado ao operario
}
Enter fullscreen mode Exit fullscreen mode

Os parâmetros dos métodos necessitam terem seus tipos indicados, com o nome do parâmetro acompanhado por dois pontos e seguido pelo seu tipo:

fun logarNotificacao(emailOperario: String, log: Logger): String {
    //loga notificao c sucesso
}
Enter fullscreen mode Exit fullscreen mode

O Kotlin nos permite informar labels(named arguments) nos argumentos, e com isto ao passar para o método podemos alterar a ordem.

logarNotificacao(log = logger, emailOperario = email)

A convenção da linguagem inclusive recomenda o uso de named arguments quando houverem mais de um parâmetro do mesmo tipo ou para parâmetros Booleanos.

Já que estamos falando de parâmetros, vamos falar dos construtores no Kotlin. A linguagem nos da a opção de dois tipos de construtores.
O primário, que definimos ao lado do nome da classe, no header, onde as parâmetros são declaradas dentro dos parênteses.

class Operario constructor(nome: String) {/*...*/}

Caso o construtor não possua anotações ou modificador de visibilidade podemos omitir a palavra chave constructor:

class Beneficio(
    val nome: String, 
    val tipo: TipoBeneficio,
    val desconto: Boolean = false
) {
  /*...*/
}
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, além do omissão da palavra chave constructor os parâmetros recebidos pelo construtor já foram declarados como propriedade da classe ao adicionar a palavra chave val, também é possível utilizar var.

Um detalhe para que a convenção da lingaguem recomenda uma quebra de linha nos parâmetros, quando houverem muitos, além do parênteses que fecha em uma nova linha.
É possível declarar um valor default, como no exemplo, com a propriedade booleana desconto.

Caso exista alguma lógica que precisa ser realizada no construtor podemos criar um bloco init dentro da classe.

class Beneficio(
    val titulo: String, 
    val tipo: TipoBeneficio,
    val desconto: Boolean = false
) {

  init {
    //realiza alguma logica com alguma das propriedades
  }
}
Enter fullscreen mode Exit fullscreen mode

Como segunda opção temos o construtor secundário, onde podemos implementar alguma lógica existente dentro de um bloco constructor:

class Beneficio() {

  var titulo: String = ""   

  constructor(tituloBeneficio: String) {
    // implementa alguma logica com a propriedade
  }
}
Enter fullscreen mode Exit fullscreen mode

O mais comum que vamos ver no dia a dia irá ser o uso do construtor primário.

E para finalizar, vamos abordar como o Kotlin trabalha com encapsulamento através dos getters e setters.

Por sua existência implícita não se costuma criar getters e setters no Kotlin. O get e set vão possuir as mesmas visibilidades das propriedades a que se referem.

Porém as visibilidades do get e set podem ser customizadas.

 var titulo: String = ""
    private set
Enter fullscreen mode Exit fullscreen mode

No exemplo acima o get para titulo, assim como a propriedade, vão ter uma visibilidade pública, já o set passou a ser private. Logo pode ser lida por qualquer um, porém apenas modificada dentro da classe.

E para os casos em que precisamos adicionar lógica aos get e set?
O Kotlin nos permite customizar isto também:

var titulo: String = ""
  set(tituloBeneficio) {
    if(tituloBeneficio.length <= tamanhoMaximoPermitido) {
      field = tituloBeneficio
    }
  }
Enter fullscreen mode Exit fullscreen mode

No exemplo temos a customização de uma lógica ao set da propriedade titulo. O interessante de notar aqui é a palavra chave field, que se refere a propriedade em questão, titulo.
Portanto, no exemplo temos uma validação da quantidade de caracteres do valor recebido(tituloBeneficio), para então a atribuição a propriedade titulo representado pela palavra chave field.

Concluo aqui este post onde me preocupei em trazer pontos do Kotlin diferentes da maioria das linguagens. A linguagem traz outros pontos interessantes e de destaque, porém creio ser melhor abordar em outras postagens.

Obrigado pelo seu tempo e se pensa que ficou faltando algo, aceito sugestões.

Top comments (0)