Construtores

Construtores

Observação: O arquivo utilizado neste conteúdo que fala sobre os métodos construtores é o 2-construtores.kt.

Neste conteúdo vamos aprender um pouco mais sobre os métodos construtores pertencentes a nossas classes.

O que são métodos construtores?

Como o próprio nome já nos diz, esses métodos são responsáveis por lidar com a criação dos objetos existentes dentro da classe.

Atribuindo valores a nossos atributos, ou quem sabe realizando algumas operações necessárias, como a execução de métodos, por exemplo.

No conteúdo anterior, que fala sobre Classes, nós vimos um pouco sobre os métodos construtores, aprendendo que os parêntesis existentes na declaração das classes, são considerados como um método construtor.

Como por exemplo:

class Produto(){//A classe produto possui um método construtor que não atribuiu a nada

}

class Pessoa(val nome: String){//A classe pessoa possui um método construtor que recebe os valores e atribui aos nossos atributos.

}

class Condominio{//A classe não possui um método construtor atrelado a ela

}

Métodos Construtores dentro da Classe

Nem sempre nós queremos declarar nossos atributos e criar nossos construtores junto a declaração da própria classe, mas como também queremos fazer isso dentro do bloco da classe.

class Condominio{//Classe não tem construtor atrelado

//podemos existir diversos construtores na classe

var apartamento: Int? = null//Podemos assumir um valor padrão ou deixar como nulo

constructor(apartamento: Int){//Realizando o construtor normalmente
this.apartamento = apartamento
}

}

No exemplo acima, nós chamamos essa classe normalmente, como se existissem os parêntesis que recebessem o atributo apartamento por parâmetro:

var condominioMeu: Condominio = Condominio(11)

println("Apt: ${condominioMeu.apartamento}")

É importante ressaltar que uma classe pode ter diversos construtores atrelados a ela, desde que cada um deles receba atributos diferentes:

class Log {//Exemplo de uma classe que possui 2 construtores

constructor(data: String) {
// algum código...
}

constructor(data: String, numberOfData: Int) {
// algum código...
}

}

Declarando os dois tipos de construtores

Veja o que acontece quando tentamos declarar os dois tipos de construtores dentro de uma mesma classe:

class TesteConstrutores(var nome: String){

val nomeDaPessoa: String? = null

constructor(var nome: String){
this.nomeDaPessoa = nome
}
}

No caso do código acima, o compilador irá gerar um erro chamado de Overload, que nada mais é do que um conflito dos métodos construtores.

Para resolver isso, precisamos fazer com que o método construtor que esta declarado dentro da classe, receba o construtor declarado na própria classe por meio do this, atribuindo um novo parâmetro:

class TesteConstrutores(var nome: String, val idade: Int){

var nomeDaPessoa: String? = null

constructor(nome: String, idade: Int, outroValor: String): this(nome, idade){
this.nomeDaPessoa = nome
}

}

Com isso, poderíamos chamar esses construtores da seguinte forma:

var testeUm: TesteConstrutores = TesteConstrutores("Micilini", 12)
var testeDois: TesteConstrutores = TesteConstrutores("Micilini", 12, "OOP")

Observe um outro exemplo:

class CondominioDois(var apartamento: Int, var numeroQuartos: Int){

//constructor(apartamento: Int, numeroQuartos: Int) : this(apartamento, numeroQuartos)//Esse construtor inicialmente vai dar erro, pois estamos definindo
//um construtor secundário que atribui as mesmas variáveis que o anterior (feito nos parâmetros dessa classe), e isso gera um erro chamado de overload

constructor(apartamento: Int, numeroQuartos: Int, documento: String) : this(apartamento, numeroQuartos)//Para seguir essa estrategia precisamos declarar
//uma nova variável, como é o caso da variável chamada 'documento'

}

Construtor Privado

Com o Kotlin também é possível privar um construtor, de modo que não consigamos instanciar: 

class naoInstanciada private constructor()//Exemplo de classe que não pode ser instanciada: Ex: Erro ao fazer nao Instanciada()

class OutroExemplo private constructor(){

}

Este é um exemplo de classe que não queremos que o desenvolvedor instancie.

Nesse caso, você só consegue ter acesso ao método construtor da classe e a sua instância, por meio dos métodos/atributos estáticos, assunto que veremos em conteúdos posteriores.

Chamando métodos dentro de Construtores

Como dito no início deste conteúdo, você pode fazer o uso dos métodos construtores para chamar um método específico dentro da classe:

class TesteConstrutoresDois{

var nomeDaPessoa: String? = null

constructor(nome: String){
this.nomeDaPessoa = nome
inicio()
}

fun inicio(){
println("Fui instanciada, chegou a hora de realizar algumas operações iniciais...")
}

}

Conclusão

Neste conteúdo você aprendeu um pouco mais sobre os métodos construtores de uma classe, e como usa-los no seu dia a dia.

Até o próximo conteúdo 🙂